繁体   English   中英

django-rest-framework 接受 JSON 数据?

[英]django-rest-framework accept JSON data?

我使用创建了 RESTFul API。 用户端点是: /api/v1/users

我想创建一个新用户,所以我以 JSON 格式发送用户数据:

{
    "username": "Test1",
    "email": "test1@gmail.com",
    "first_name": "Test1",
    "last_name": "Test2",
    "password":"12121212"
}

我正在使用 Google Chrome 扩展 Postman 来测试 API。 但是,在发送请求后,用户数据并没有保存。 响应包含此错误:

{
    "detail": "Unsupported media type \"text/plain;charset=UTF-8\" in request."
}

这是 Postman 中请求详细信息的样子:

Postman API 请求 django-rest-framework 错误

您错过了在标题部分添加Content-Type标题。 只需将Content-Type标头设置为application/json即可。

见下图:

邮差

此外,您可能还需要在标头中包含 CSRF 令牌,以防在使用 Postman 发出POST请求时收到错误{"detail": "CSRF Failed: CSRF token missing or incorrect."} 在这种情况下,添加一个X-CSRFToken标头,其值也作为 CSRF 令牌值。

如果有人遇到像我这样的问题,我会发布这个答案。

我正在使用Angular 2和使用Django Rest Framework制作的 API 开发前端应用程序,并且我曾经发送带有以下标头的请求:

'Content-Type': 'application/json'

它工作正常,直到我在Fire Fox上尝试它并且我无法加载所需的数据,我通过添加以下标题解决了它

'Content-Type': 'application/json',
'Accept': 'application/json'

这里有一个解释, Content-Type告诉服务器数据的内容类型是什么,而Accept告诉它客户端将接受什么内容类型。

这是关于这个问题的一个很好的明确答案:

https://webmasters.stackexchange.com/questions/31212/difference-between-the-accept-and-content-type-http-headers

您需要执行两个步骤来完成此问题:

  1. 添加带有application/jsonContent-Type标头
  2. 添加带有Token {YOUR_CUSTOM_TOKEN}值的Authorization标头以传递 CSRFToken

注意:如果你想通过 session 进行身份验证,你不需要做第二步,但是如果你想在移动端使用这个 API,你必须将 Authorization 标头传递给服务器

我希望它有帮助

您需要通过设置适当的标头来定义内容类型。 如果是 Postman,您需要在 url 字段下设置以下值:

标题:“内容类型”

值:应用程序/json

我必须添加以下内容才能使其正常工作(我正在使用来自客户端的 node-fetch btw 来执行 POST):

supportHeaderParams: true,
headers: { "Content-Type": "application/json; charset=UTF-8" },

如果您想使用 Django Rest Framework 接受 JSON 数据,需要做几件事。

  1. 确保发送 application/json 标头: 'Content-Type: application/json'

  2. settings.py中选择 JSON Parser

    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',
        ],    
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM