The following code only works in curl. It would be nice if you could tell me why it isnt working in Python using Requests
下面的代码只适用于curl。如果您能告诉我为什么在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. I'm not getting the same response from both the code.
最初curl请求有其他内容,但我意识到我可以删除几个。我不确定是否导致了错误,因为curl请求正在工作。我不会从代码中得到相同的响应。
This might be useful. A Curl Requests extracted from Chrome Dev Tools
这可能是有用的。从Chrome Dev工具中提取的Curl请求。
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
1 个解决方案
#1
7
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请求,但是您正在使用请求。GET()代替,发送GET请求(它的主体被忽略)。
Make it a POST instead, by using request.post()
:
使用request.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:
您还需要:
- not use a list for the
content-type
header, there is no support for paramaters being specified separately. - 不使用内容类型头的列表,不支持单独指定的参数。
- Encode your JSON data to a JSON string;
requests
doesn't do this for you. Instead, a dictionary passed todata
is encoded asapplication/x-www-form-urlencoded
data instead. - 将JSON数据编码为JSON字符串;请求不会为你做这些。相反,传递给数据的字典被编码为应用程序/x-www-form-urlencode数据。
You can compare the curl
command with requests
more easily using http://httpbin.org/post:
您可以使用http://httpbin.org/post将curl命令与请求进行比较。
$ 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; it'll set the correct Content-Type header too, if you pass in the data to send as the json
keyword argument:
如果您使用的是请求版本2.4.2或更新,您也可以将JSON编码留给库;它还将设置正确的内容类型标题,如果您传入数据以发送json关键字参数:
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
#1
7
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请求,但是您正在使用请求。GET()代替,发送GET请求(它的主体被忽略)。
Make it a POST instead, by using request.post()
:
使用request.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:
您还需要:
- not use a list for the
content-type
header, there is no support for paramaters being specified separately. - 不使用内容类型头的列表,不支持单独指定的参数。
- Encode your JSON data to a JSON string;
requests
doesn't do this for you. Instead, a dictionary passed todata
is encoded asapplication/x-www-form-urlencoded
data instead. - 将JSON数据编码为JSON字符串;请求不会为你做这些。相反,传递给数据的字典被编码为应用程序/x-www-form-urlencode数据。
You can compare the curl
command with requests
more easily using http://httpbin.org/post:
您可以使用http://httpbin.org/post将curl命令与请求进行比较。
$ 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; it'll set the correct Content-Type header too, if you pass in the data to send as the json
keyword argument:
如果您使用的是请求版本2.4.2或更新,您也可以将JSON编码留给库;它还将设置正确的内容类型标题,如果您传入数据以发送json关键字参数:
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