在 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/json
。 Json 参数基本上编码数据 发送成 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 中使用 AJAX 显示 rest api?
如何修复在 Django Rest Framework 中使用 REST API 登录时出现的 CSRF 错误?