当前位置: 首页 > 知识库问答 >
问题:

使用FETCH获取JSON解析时出错,但使用PostMan时没有

尚阳炎
2023-03-14

我已经使用Django和Django rest框架设置了一个APIendpoint,以使用POST请求提交表单。当使用PostMan发送请求时,后端工作正常,并将数据添加到数据库中。但是,当我使用fetch时,后端返回{“detail”:“JSON解析错误-期望值:第1行第1列(char 0)”}。前端是一个react网页包设置。

这是我用来发出请求的代码:

    let csrftoken = getCookie('csrftoken')

    const jsonString = JSON.stringify(data,null, '    ')
    console.log(jsonString)

    const response = await fetch(baseURL + 'jobs/',{
        method: 'POST',
        mode: 'same-origin',
        cache: 'no-cache',
        credentials: 'same-origin',
        headers: {
            'Content-Type': 'application/json',
            'Accept': '*/*',
            'X-CSRFToken': csrftoken,
            'Accept-Encoding': 'gzip, deflate, br'
        },
        body: jsonString
        });
    return response.json()
}

下面是jsonString的打印:

{
    "data": "asdf",
    "mode": "text",
    "node": "sdaf",
    "species": "asdf",
    "model_type": "proto",
    "dry_run": false,
    "single_fam_mode": false,
    "mail_address": ""
}

我还使用wireshark捕获PostMan和获取请求。这是邮递员的请求,成功的响应:

[1 bytes missing in capture file].POST /api/jobs/ HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.28.3
Accept: */*
Postman-Token: 8c4b0ff0-5430-4420-8785-e965a808db5c
Host: localhost:8000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 184

{
    "data": "asdsadad",
    "mode": "text",
    "node": "katten",
    "model_type": "both",
    "dry_run": false,
    "single_fam_mode": false,
    "mail_address": "test@teast1.no"
}HTTP/1.1 201 Created
Date: Tue, 31 Aug 2021 09:10:32 GMT
Server: WSGIServer/0.2 CPython/3.8.5
Content-Type: application/json
Vary: Accept, Origin, Cookie
Allow: GET, POST, OPTIONS
X-Frame-Options: DENY
Content-Length: 271
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin

{"id": "4c6baad3-be1a-4463-8c06-edec51443565", "initiated": "2021-08-31T09:10:32.850533Z", "data": "asdsadad", "mode": "text", "species": "job@09:10:32", "node": "katten", "model_type": "both", "dry_run": false, "single_fam_mode": false, "mail_address": "test@teast1.no"}

然而,这是带有400响应的提取请求:

POST /api/jobs/ HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: */*
Accept-Language: nb-NO,nb;q=0.9,no-NO;q=0.8,no;q=0.6,nn-NO;q=0.5,nn;q=0.4,en-US;q=0.3,en;q=0.1
Accept-Encoding: gzip, deflate
Referer: http://localhost:8000/
Content-Type: application/json
X-CSRFToken: Qv2chVzt4hiDZbe7jYDtUiP7o3IuXzVHnUUc03PYZI8FWKrOCC655rdoaThgQb1B
Origin: http://localhost:8000
Content-Length: 164
DNT: 1
Connection: keep-alive
Cookie: csrftoken=Qv2chVzt4hiDZbe7jYDtUiP7o3IuXzVHnUUc03PYZI8FWKrOCC655rdoaThgQb1B; sessionid=eqh9wotdlhh43ubszv7ievd03fnhh0fl
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: same-origin
Sec-Fetch-Site: same-origin

{
    "data": "sadf",
    "mode": "text",
    "node": "asdf",
    "species": "asdf",
    "model_type": "proto",
    "dry_run": false,
    "single_fam_mode": false,
    "mail_address": ""
}HTTP/1.1 400 Bad Request
Date: Tue, 31 Aug 2021 10:03:05 GMT
Server: WSGIServer/0.2 CPython/3.8.5
Content-Type: application/json
Vary: Accept, Origin, Cookie
Allow: GET, OPTIONS, POST
X-Frame-Options: DENY
Content-Length: 73
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin

{"detail":"JSON parse error - Expecting value: line 1 column 1 (char 0)"}

我没有包含任何后端代码,因为我认为它工作正常,因为邮递员请求成功了。

有人能告诉我我的提取请求有什么问题吗?

共有3个答案

袁晋鹏
2023-03-14

解决了!这实际上是火狐(v.91.0.2 Mac OS X)。一旦我换了Safari或火狐开发者浏览器,它就工作了。但不确定实际问题是什么。

梁英喆
2023-03-14

我可以建议你试着传递body,但不要把它串起来。我不太熟悉react。js但是在常规的ajax请求中,json传递得很好,没有字符串化。即。:

const response = await fetch(baseURL + 'jobs/',{
    ...
    body: data
    });
劳法
2023-03-14

如上所述,请尝试urllib3,您的代码可能如下所示:

import urllib3
import json

def get_response():
    data = {
        "data": "asdf",
        "mode": "text",
        "node": "sdaf",
        "species": "asdf",
        "model_type": "proto",
        "dry_run": False,
        "single_fam_mode": False,
        "mail_address": ""
        }

    try:

        encoded_data = json.dumps(data).encode('utf-8')
        http = urllib3.PoolManager()

        response = http.request(
            'POST',
            baseURL + 'jobs/',
            body=encoded_data,
            headers={
                'Content-Type': 'application/json',
                'Accept': '*/*',
                'X-CSRFToken': csrftoken,
                'Accept-Encoding': 'gzip, deflate, br'
            }
        )
        return json.loads(response.data.decode('utf-8'))

    except:
        #Handle your error
        pass
 类似资料:
  • 我正在尝试使用Jackson解析JSON,这是我的类 还有跑步者 setName方法正在工作,但在客户中得到null。getName()。我不想用莫西

  • 问题内容: 我正在尝试将JSON文件读入R,但出现此错误: 我从http://1usagov.measuredvoice.com/下载了该文件,并使用7zip解压缩,然后在R中使用了以下代码: 我不确定为什么会发生此错误,我在Google上进行了查询,但没有任何信息可以帮助我?这是文件问题还是我的代码? 问题答案: 另一个更新 您可以使用该软件包来处理ndjson / streaming JSON

  • 我在后端使用Axios时遇到了问题。这可能是一个非常简单的修复,因为我是新手。 邮递员:对于有效和无效的凭据都收到正确的响应。 axios:对于有效的crendentials会收到正确的响应,但是当输入无效的凭据时,axios方法的catch块会运行。

  • 直接在我的浏览器中输入时(appId已删除) http://api.openweathermap.org/data/2.5/weather?q=37421 我得到了这个预期的回应 {“coord”:{“lon”:73,“lat”:31.32},“weather”:[{“id”:800,“main”:“Clear”,“description”:“clear sky”,“icon”:“01n”}],“

  • 当xjc解析followinf xsd时,我得到了“Prolog中的错误” 我已经检查了xsd的有效性,没有发现任何错误。开始前没有字符也。。。

  • 在使用RestTemplate从另一个服务获取数据时,我在postman中出错。 我有两种服务。第一个服务有userdetails实体类,第二个服务有posts实体类。这是邮局管理员的代码。 我在《邮递员》中看到了这个错误。 编辑-尝试@Pijotrek的解决方案后,我现在得到这个错误。 这是我的实体类、DAO和JPARepository 这是UserDetails的实体类 这是我一直从后控制器调