2012-10-22 39 views
2

當我使用使POST請求以下使用「內容類型:應用/ JSON」在捲曲後給出HTTP/1.1 400 BAD REQUEST

curl -i -d "username=rock&password=rock" http://my_VM_IP/api/1.1/json/my_login/ 

它產生所要求的反應產生這樣的令牌(有刪節):

HTTP/1.1 200 OK 
Date: Mon, 22 Oct 2012 08:37:39 GMT 
Vary: Authorization,Accept-Language,Cookie,Accept-Encoding 
Content-Type: text/plain 
Transfer-Encoding: chunked 
OK{"success": {"my_token": "required_token"}} 

但是,當我嘗試同樣包括一個頭爲:

curl -i -H "Content-Type:application/json" -d "username=rock&password=rock" http://my_VM_IP/api/1.1/json/my_login/ 

它給我以下錯誤:

HTTP/1.1 400 BAD REQUEST 
Date: Mon, 22 Oct 2012 11:12:04 GMT 
Vary: Authorization,Accept-Language,Cookie,Accept-Encoding 
***Content-Type: text/plain*** 
Content-Language: en-us 
Connection: close 
Transfer-Encoding: chunked 
Bad Request 

我不明白爲什麼會發生這種情況。而且還爲什麼內容類型顯示text/plain的,我也試過看着像Why Setting POST Content-type:"Application/Json" causes a "Bad Request" on REST WebService?一些其他問題。它也解決了我有同樣的問題。答案之後,我試圖給出各種格式的數據,如

{"username":"rock", "password":"rock"} 

但沒有成功。提前致謝。

回答

3

使用-H "Content-Type:application/json"你T設置他Content-Type標題爲您的請求響應仍會返回您的視圖告訴它返回的內容。

返回與application/json內容類型的響應,用的東西沿着這些線路:

import json 
from django.http import HttpResponse 

def json_response(return_vars): 
    'JSON-encodes return_vars returns it in an HttpResponse with a JSON mimetype' 
    return HttpResponse(json.dumps(return_vars), content_type = "application/json") 

#Usage: return json_response({'admin_token': admin_api_token.token}) 
+0

如果能詳細說明一下,我會很高興。目前我簡單地返回令牌如下:admin_api_token = admin_models.ApiToken.objects.create(管理員=管理員) [下一行]返回json_success_response({ 'admin_token':admin_api_token.token})P.S.所有例外都被照顧。 –

+1

所有你需要做的是1)JSON編碼你的數據,2)添加'content_type =「application/json」'到'HttpResponse'構造函數。在你的情況下,'HttpResponse'由'json_success_response'返回。 –

+0

添加content_type沒有任何作用..並添加Content-Type作爲返回HttpResponse(json.dumps(response),Content-Type =「application/json」)給出SyntaxError:關鍵字不能是表達式 –

2

你接近,但你需要通過curl發給一個JSON格式:

curl -i -H "Content-Type:application/json" -d '{"username":"rock", "password":"rock"}' 

"password","admin"應該"password":"admin"


如果不工作,請嘗試:

curl --dump-header - -H "Accept:application/json" -H "Content-Type:application/json" -X POST --data '{"username": "admin", "password": "admin"}' http://my_VM_IP/api/1.1/json/my_login/ 
+0

非常感謝您的回覆。那是一個我正在糾正的拼寫錯誤。如果你可以告訴我爲什麼它仍然顯示這個Content-Type:text/plain –

+0

@TheRecruit查看其他答案,你可能沒有在你的響應中正確設置「content-type」。 –

+0

我怎樣才能做到這一點與PHP代碼不是命令行? – Manwal

0

當您設置curl命令的-H參數,指定內容類型的請求。響應中看到的響應的內容類型在服務器上設置。在WSGI應用程序中,您需要手動指定'content-type''content-length'。某些框架提供實用方法來返回JSON響應(例如,Flask中的jsonify方法)。