使用“Content-Type:application / json”在curl中发布会给出HTTP / 1.1 400 BAD REQUEST

时间:2012-10-22 11:22:30

标签: django api curl http-post django-piston

当我使用以下

发布帖子请求时
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

我不明白为什么会这样。此外 为什么内容类型显示文字/简单 ,我也尝试查看其他问题,如Why Setting POST Content-type:"Application/Json" causes a "Bad Request" on REST WebService?。它也解决了我遇到的同样问题。在答案之后,我尝试以各种格式提供数据

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

但没有成功。提前谢谢。

3 个答案:

答案 0 :(得分: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})

答案 1 :(得分: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/

答案 2 :(得分:0)

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