在 django rest api 中使用 POST 解析 Json 错误

Posted

技术标签:

【中文标题】在 django rest api 中使用 POST 解析 Json 错误【英文标题】:Json parse error using POST in django rest api 【发布时间】:2015-03-22 18:20:29 【问题描述】:

我正在尝试通过 Django REST 框架实现一个简单的 GET/POST api

views.py

class cuser(APIView):
def post(self, request):
   stream  = BytesIO(request.DATA)
    json = JSONParser().parse(stream)
    return Response()

urls.py

from django.conf.urls import patterns, url
from app import views
urlpatterns = patterns('',

           url(r'^challenges/',views.getall.as_view() ),
           url(r'^cuser/' , views.cuser.as_view() ),
      )

我正在尝试将POST 一些json 转换为/api/cuser/(api 是我项目的urls.py 中的命名空间), JSON


"username" : "abhishek",
"email" : "john@doe.com",
"password" : "secretpass"

我从 Browseable API 页面和httpie(类似于 curl 的 python 制作工具)都试过了

httpie command

http --json POST http://localhost:58601/api/cuser/ username=abhishek email=john@doe.com password=secretpass

但我收到 JSON 解析错误:

JSON parse error - Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

Whole Debug message using --verbose --debug

    POST /api/cuser/ HTTP/1.1

Content-Length: 75

Accept-Encoding: gzip, deflate

Host: localhost:55392

Accept: application/json

User-Agent: HTTPie/0.8.0

Connection: keep-alive

Content-Type: application/json; charset=utf-8



"username": "abhishek", "email": "john@doe.com", "password": "aaezaakmi1"

HTTP/1.0 400 BAD REQUEST

Date: Sat, 24 Jan 2015 09:40:03 GMT

Server: WSGIServer/0.1 Python/2.7.9

Vary: Accept, Cookie

Content-Type: application/json

Allow: POST, OPTIONS



"detail":"JSON parse error - Expecting property name enclosed in double quotes: line 1 column 2 (char 1)"

【问题讨论】:

准确地显示您是如何发布该 JSON 的。从哪里来? @DanielRoseman 尝试了httpie 和可浏览的 api 页面 尝试在 HTTPie 命令中添加--verbose --debug。这将向您显示正在发送的请求以及一些额外的调试输出。 @JakubRoztočil 添加了调试输出,虽然我无法从中获得太多收益 我认为服务器端存在一些错误。请求/JSON 看起来是正确的。您也可以尝试向httpbin.org 发送相同的请求,看看它是如何被解释的:$ http --json httpbin.org/post username=abhishek email=john@doe.com password=secretpass 【参考方案1】:

我是通过 Google 获得这篇文章的

"detail": "JSON 解析错误 - 期望属性名称用双引号括起来": 原来你不能在 JSON 中有 尾随逗号

因此,如果您遇到此错误,您可能需要像这样更改帖子:


    "username" : "abhishek",
    "email" : "john@doe.com",
    "password" : "secretpass",

到这里:


    "username" : "abhishek",
    "email" : "john@doe.com",
    "password" : "secretpass"

注意 JSON 对象中最后一个属性后删除的 逗号

【讨论】:

【参考方案2】:

基本上,每当您尝试使用 requests 库发出发布请求时,该库还包含 json 参数,当数据参数设置为文件或数据时,该参数将被忽略。所以基本上当 json 参数设置为 json 数据时。标头设置为Content-Type: application/jsonJson 参数基本上编码数据 发送成 json 格式。因此在 DRF 尤其能够解析 json 数据。否则在只有数据参数的情况下,它被视为表单编码

requests.post(url, json="key1":"value1")

你可以在这里找到更多request.post complicated post methods

【讨论】:

【参考方案3】:

您遇到的问题是您的请求已经被解析,而您正尝试再次解析它。

来自"How the parser is determined"

视图的有效解析器集始终定义为类列表。当request.data 被访问时,REST framework 将检查传入请求的 Content-Type 标头,并确定使用哪个解析器来解析请求内容。

在您的代码中,您访问的是request.DATA,它是request.data 的2.4.x 等价物。因此,只要您调用它,您的请求就会被解析,request.DATA 实际上正在返回您期望解析的字典。

json = request.DATA

确实是解析传入的 JSON 数据所需的一切。您确实将 Python 字典传递给 json.loads,它似乎无法解析它,这就是您收到错误的原因。

【讨论】:

发回时数据是否也自动渲染为json? 如果你使用自定义响应类,是的。

以上是关于在 django rest api 中使用 POST 解析 Json 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 HTML 页面或模板中使用 Django-REST-Framework 从在 Django 中创建的 API 获取/显示 API 数据

如何在 Django 中使用 RESTful API

如何在 Django 中使用 AJAX 显示 rest api?

如何修复在 Django Rest Framework 中使用 REST API 登录时出现的 CSRF 错误?

如何在 Django REST API 中使用 GPS 位置?

如何在 django-rest-framework 中为 API 使用 TokenAuthentication