2

当我使用以下内容发出发布请求时

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

我不明白为什么会这样。还有为什么 content-Type 显示 text/plain,我还尝试查看其他一些问题,例如为什么设置 POST Content-type:"Application/Json" 会导致 REST WebService 出现“错误请求”?. 它也解决了我遇到的同样的问题。按照答案,我尝试以各种格式提供数据

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

但没有成功。提前致谢。

4

3 回答 3

3

通过使用-H "Content-Type:application/json"您正在Content-Type为您的请求设置标头。响应仍将返回您的视图告诉它返回的任何内容。

要返回带有 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})
于 2012-10-22T12:02:53.383 回答
2

您很接近,但您需要通过以下方式将其作为 JSON 格式发送curl

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/
于 2012-10-22T11:39:31.340 回答
0

当您设置-Hcurl 命令的参数时,您指定请求的内容类型。您在响应中看到的响应内容类型是在服务器上设置的。'content-type'在 WSGI 应用程序中,您需要'content-length'手动指定。一些框架提供实用方法来返回 JSON 响应(例如,jsonifyFlask 中的方法)。

于 2012-10-22T12:07:07.140 回答