I am trying to implement a simple GET/POST api via Django REST framework
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() ),
)
I am trying to POST
some json to /api/cuser/
(api is namespace in my project's urls.py
) ,
the JSON
{
"username" : "abhishek",
"email" : "john@doe.com",
"password" : "secretpass"
}
I tried from both Browseable API page and httpie
( A python made tool similar to curl)
httpie command
http --json POST http://localhost:58601/api/cuser/ username=abhishek email=john@doe.com password=secretpass
but I am getting JSON parse error :
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)"}
Basically, whenever you are trying to make a post request with requests lib, This library also contains json argument which is ignored in the case when data argument is set to files or data. So basically when json argument is set with json data. Headers are set as
Content-Type: application/json
. Json argument basically encodes data sends into a json format. So that at DRF particularly is able to parse json data. Else in case of only data argument it is been treated as form-encodedrequests.post(url, json={"key1":"value1"})
you can find more here request.post complicated post methods
The problem that you are running into is that your request is already being parsed, and you are trying to parse it a second time.
From "How the parser is determined"
In your code you are accessing
request.DATA
, which is the 2.4.x equaivalent ofrequest.data
. So your request is being parsed as soon as you call that, andrequest.DATA
is actually returning the dictionary that you were expecting to parse.is really all you need to parse the incoming JSON data. You were really passing a Python dictionary into
json.loads
, which does not appear to be able to parse it, and that is why you were getting your error.I arrived at this post via Google for " "detail": "JSON parse error - Expecting property name enclosed in double quotes:". Turns out you CANNOT have a trailing comma in JSON, as I am accustomed to having in a Python dictionary. So if you are getting this error you may need to change a post like this:
to this:
Note the removed comma after the last property in the JSON object.