現在、RESTful json API の作成をテストしています。その過程で、主に curl を介してデータを投稿して、リクエストを通じてログインできるかどうかをテストしています。ハッキングしてもどうすればいいのかわかりませんが、それは別の問題です。
次の POST リクエストをアプリに送信しています。
curl -X POST http://localhost:6543/users/signin -d '{"username":"a@a.com","password":"password"}'
そして、リクエストに含まれるデータを見ると、出力は非常に奇妙です。
ipdb> self.request.POST
MultiDict([('{"username":"a@a.com","password":"password"}', '******')])
ipdb> self.request.POST.keys()
['{"username":"a@a.com","password":"password"}']
ipdb> self.request.POST.values()
[u'']
それで、私のjsonオブジェクトを文字列キーとして、空の文字列をその値として持つMultiDictになりますか?! それは正しくないようです。
json 宣言で単一引用符を削除すると、次のようになります。
ipdb> self.request.POST
MultiDict([('username:a@a.com', u'')])
私のデータが正しく投稿されない理由を知っている人はいますか?
アップデート:
明確にするために、私が使用しているヘッダーは実際には application/x-www-form-urlencoded です。
ipdb> self.request.headers['CONTENT-TYPE']
'application/x-www-form-urlencoded'
私が見つけたのは、何らかの理由で、次の操作を行うとリクエストライブラリが機能することです。
In [49]: s.post('http://localhost:6543/users/signin', data=[('username', 'a@a.com'), ('password', 'password')], headers={'content-type': 'application/x-www-form-urlencoded'})
Out[49]: <Response [200]>
ただし、curl で期待どおりに動作しないという事実は、依然として厄介です。