Django RESTフレームワークを介して単純なGET/POSTAPIを実装しようとしています
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" : "[email protected]",
"password" : "secretpass"
}
ブラウズ可能なAPIページとhttpie
の両方から試しました(A python curlに似たツールになりました)
httpie command
http --json POST http://localhost:58601/api/cuser/ username=abhishek [email protected] 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": "[email protected]", "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)"}
発生している問題は、リクエストがすでに解析されており、もう一度解析しようとしていることです。
From "パーサーの決定方法"
ビューの有効なパーサーのセットは、常にクラスのリストとして定義されます。
request.data
にアクセスすると、RESTフレームワークは、着信リクエストのContent-Typeヘッダーを調べ、リクエストコンテンツの解析に使用するパーサーを決定します。
コードでは、request.DATA
にアクセスしています。これはrequest.data
の2.4.xに相当します。したがって、リクエストはそれを呼び出すとすぐに解析され、request.DATA
は実際に解析する予定の辞書を返します。
json = request.DATA
着信JSONデータを解析するために必要なのは本当にすべてです。あなたは本当にPython辞書をjson.loads
に渡していましたが、それを解析できないようです。そのため、エラーが発生していました。
「詳細」についてGoogle経由でこの投稿にアクセスしました:「JSON解析エラー-二重引用符で囲まれたプロパティ名が必要です:」。JSONで末尾のカンマを使用できないことが判明しました。したがって、このエラーが発生した場合は、次のように投稿を変更します。
{
"username" : "abhishek",
"email" : "[email protected]",
"password" : "secretpass",
}
これに:
{
"username" : "abhishek",
"email" : "[email protected]",
"password" : "secretpass"
}
JSONオブジェクトの最後のプロパティの後に削除されたコンマに注意してください。
基本的に、requests libを使用してPOSTリクエストを作成しようとすると、このライブラリにはjson引数も含まれます。これは、data引数がfilesまたはdataに設定されている場合は無視されます。したがって、基本的にjson引数がjsonデータで設定されている場合。ヘッダーは_Content-Type: application/json
_として設定されます。 Json引数は基本的にデータをエンコードはjson形式で送信します。そのため、DRFでは特にparse json dataを実行できます。それ以外の場合、データ引数のみの場合は、フォームエンコードとして扱われます
requests.post(url, json={"key1":"value1"})
あなたはここでもっと見つけることができます request.post複雑なpostメソッド