我正在尝试通过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"
}
我尝试了可浏览的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)"}
答案 0 :(得分:8)
您遇到的问题是您的请求已被解析,并且您正在尝试再次解析它。
来自"How the parser is determined"
视图的有效解析器集始终定义为类列表。访问
request.data
时,REST框架将检查传入请求的Content-Type标头,并确定用于解析请求内容的解析器。
在您的代码中,您正在访问request.DATA
,即request.data
的2.4.x等效值。因此,只要您调用它,您的请求就会被解析,而request.DATA
实际上正在返回您希望解析的字典。
json = request.DATA
实际上只需要解析传入的JSON数据。你真的把Python字典传递给json.loads
,它似乎无法解析它,这就是你收到错误的原因。
答案 1 :(得分:3)
我是通过谷歌来到这个帖子的" "详细信息":" JSON解析错误 - 期望用双引号括起来的属性名称:"。原来你不能在JSON中有一个尾随逗号,因为我习惯于在Python字典中使用。因此,如果您收到此错误,则可能需要更改此类帖子:
{
"username" : "abhishek",
"email" : "john@doe.com",
"password" : "secretpass",
}
到此:
{
"username" : "abhishek",
"email" : "john@doe.com",
"password" : "secretpass"
}
请注意JSON对象中最后一个属性之后删除的逗号。
答案 2 :(得分:0)
基本上,每当您尝试使用请求库发出发布请求时,该库还包含json参数,当data参数设置为文件或数据时,该参数将被忽略。因此基本上,当 json 参数设置为json数据时。标头设置为Content-Type: application/json
。 Json 参数基本上编码数据,将其发送为 json 格式。这样一来,在DRF,尤其能够解析json 数据。否则,如果仅使用数据参数,则将其视为形式编码
requests.post(url, json={"key1":"value1"})