[英]Python HTTP Request Binary Data using Requests
The following code only works in curl. 以下代码仅适用于curl。 It would be nice if you could tell me why it isnt working in Python using Requests
如果你能告诉我为什么它不能使用Requests在Python中运行会很好
curl 'http://cdcnepal.com/Modules/HOmeMoviesLists/WebService2.asmx/GetShowsByDate' \
-H 'Content-Type: application/json; charset=UTF-8' \
-d '{"portalId":"1","showDate":"26/05/2014","flag":0,"size":9}'
However in Python with the following code 但是在Python中使用以下代码
import requests
import json
url = """http://cdcnepal.com/Modules/HOmeMoviesLists/WebService2.asmx/GetShowsByDate"""
headers = {"content-type":["application/json", "charset=UTF-8"]}
payload = {"portalId":"1","showDate":"26/05/2014","flag":0,"size":9}
r = requests.get(url, headers=headers, data=payload)
print r.text
Originally the curl request had other content, below, however I realised I could remove several. 最初卷曲请求有其他内容,下面,但我意识到我可以删除几个。 I'm not sure that is causing the error because the curl request is working.
我不确定是否导致错误,因为curl请求正在运行。 I'm not getting the same response from both the code.
我没有从代码中获得相同的响应。
This might be useful. 这可能很有用。 A Curl Requests extracted from Chrome Dev Tools
从Chrome开发工具中提取的卷曲请求
curl 'http://cdcnepal.com/Modules/HOmeMoviesLists/WebService2.asmx/GetShowsByDate'
-H 'Cookie: OriginalReferrer=https://www.google.com/;
OriginalURL=http://cdcnepal.com/;
ASP.NET_SessionId=i5lbnql5hpp0wm1ywyqbywtj;
VisitCount=4'
-H 'Origin: http://cdcnepal.com'
-H 'Accept-Encoding: gzip,deflate,sdch'
-H 'Accept-Language: en-US,en;q=0.8,hi;q=0.6'
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36'
-H 'Content-Type: application/json; charset=UTF-8'
-H 'Accept: application/json, text/javascript, */*; q=0.01'
-H 'Referer:http://cdcnepal.com/Home.aspx'
-H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive'
-H 'DNT: 1'
--data-binary '{"portalId":"1","showDate":"27/05/2014","flag":0,"size":9}' --compressed
The curl
-d
switch sends a POST
request, but you are using requests.get()
instead, sending a GET
request (whose body is ignored). curl
-d
开关发送POST
请求,但您正在使用requests.get()
来发送GET
请求(其主体被忽略)。
Make it a POST instead, by using request.post()
: 使用
request.post()
使其成为POST:
import requests
import json
url = "http://cdcnepal.com/Modules/HOmeMoviesLists/WebService2.asmx/GetShowsByDate"
headers = {"content-type": "application/json; charset=UTF-8"}
payload = {"portalId":"1","showDate":"26/05/2014","flag":0,"size":9}
r = requests.post(url, headers=headers, data=json.dumps(payload))
print r.text
You also need to: 你还需要:
content-type
header, there is no support for paramaters being specified separately. content-type
标题的列表,不支持单独指定的参数。 requests
doesn't do this for you. requests
不会为您执行此操作。 Instead, a dictionary passed to data
is encoded as application/x-www-form-urlencoded
data instead. data
的字典被编码为application/x-www-form-urlencoded
数据。 You can compare the curl
command with requests
more easily using http://httpbin.org/post : 您可以使用http://httpbin.org/post更轻松地将
curl
命令与requests
比较:
$ curl http://httpbin.org/post \
> -H 'Content-Type: application/json; charset=UTF-8' \
> -d '{"portalId":"1","showDate":"26/05/2014","flag":0,"size":9}'
{
"args": {},
"data": "{\"portalId\":\"1\",\"showDate\":\"26/05/2014\",\"flag\":0,\"size\":9}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Connection": "close",
"Content-Length": "58",
"Content-Type": "application/json; charset=UTF-8",
"Host": "httpbin.org",
"User-Agent": "curl/7.30.0",
"X-Request-Id": "78d7bb7d-e29b-482b-908a-48d2395a050f"
},
"json": {
"flag": 0,
"portalId": "1",
"showDate": "26/05/2014",
"size": 9
},
"origin": "84.92.98.170",
"url": "http://httpbin.org/post"
}
and 和
>>> import requests
>>> import json
>>> from pprint import pprint
>>> url = 'http://httpbin.org/post'
>>> headers = {"content-type":"application/json; charset=UTF-8"}
>>> payload = {"portalId":"1","showDate":"26/05/2014","flag":0,"size":9}
>>> r = requests.post(url, headers=headers, data=json.dumps(payload))
>>> pprint(r.json())
{u'args': {},
u'data': u'{"portalId": "1", "flag": 0, "size": 9, "showDate": "26/05/2014"}',
u'files': {},
u'form': {},
u'headers': {u'Accept': u'*/*',
u'Accept-Encoding': u'gzip, deflate, compress',
u'Connection': u'close',
u'Content-Length': u'65',
u'Content-Type': u'application/json; charset=UTF-8',
u'Host': u'httpbin.org',
u'User-Agent': u'python-requests/2.2.1 CPython/2.7.6 Darwin/13.1.0',
u'X-Request-Id': u'06d6b542-c279-4898-8701-2c0d502aa36e'},
u'json': {u'flag': 0,
u'portalId': u'1',
u'showDate': u'26/05/2014',
u'size': 9},
u'origin': u'84.92.98.170',
u'url': u'http://httpbin.org/post'}
Both cases show the same json
dictionary being returned. 两种情况都显示返回相同的
json
字典。
If you are using requests
version 2.4.2 or newer, you can also leave the JSON encoding to the library; 如果您使用的是2.4.2或更新版本的
requests
,您也可以将JSON编码保留到库中; it'll set the correct Content-Type header too, if you pass in the data to send as the json
keyword argument: 如果传入要作为
json
关键字参数发送的数据,它也会设置正确的Content-Type标头:
import requests
url = "http://cdcnepal.com/Modules/HOmeMoviesLists/WebService2.asmx/GetShowsByDate"
payload = {"portalId":"1","showDate":"26/05/2014","flag":0,"size":9}
r = requests.post(url, json=payload)
print r.text
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.