使用 urllib 发出 post 请求
Making post request using urllib
我正在尝试向 API 提供商提出请求
curl "https://api.infermedica.com/dev/parse" \
-X "POST" \
-H "App_Id: 4c177c" -H "App_Key: 6852599182ba85d70066986ca2b3" \
-H "Content-Type: application/json" \
-d '{"text": "i feel smoach pain but no couoghing today"}'
此 curl 请求已得到响应。
但是当我尝试在代码中提出同样的请求
self.headers = { "App_Id": "4c177c", "App_Key": "6852599182ba85d70066986ca2b3", "Content-Type": "application/json", "User-Agent": "M$
self.url = "https://api.infermedica.com/dev/parse"
data = { "text": text }
json_data = json.dumps(data)
req = urllib2.Request(self.url, json_data.replace(r"\n", "").replace(r"\r", ""), self.headers)
response = urllib2.urlopen(req).read()
它给出
Traceback (most recent call last):
File "symptoms_infermedia_api.py", line 68, in <module>
SymptomsInfermedia().getResponse(raw_input("Enter comment"))
File "symptoms_infermedia_api.py", line 39, in getResponse
response = urllib2.urlopen(req).read()
File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 410, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 523, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 448, in error
return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 531, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden
json_data = json.dumps(data)
不是准备 POST 数据的正确方法。
您应该使用 urllib.urlencode()
来完成这项工作:
import urllib
data = { "text": text }
req = urllib2.Request(self.url, urllib.urlencode(data), self.headers)
response = urllib2.urlopen(req).read()
Docs:
class urllib2.Request(url[, data][, headers][, origin_req_host][,
unverifiable]) This class is an abstraction of a URL request.
data may be a string specifying additional data to send to the server,
or None if no such data is needed. Currently HTTP requests are the
only ones that use data; the HTTP request will be a POST instead of a
GET when the data parameter is provided. data should be a buffer in
the standard application/x-www-form-urlencoded format. The
urllib.urlencode() function takes a mapping or sequence of 2-tuples
and returns a string in this format.
这将是使用 python requests
库的等效请求。
url = "https://api.infermedica.com/dev/parse"
headers = {
'App_Id': '4c177c',
'App_Key': '6852599182ba85d70066986ca2b3',
'Content-Type': 'application/json',
}
data = {'text': 'i feel stomach pain but no coughing today'}
r = requests.post(url, headers=headers, data=json.dumps(data))
print r.status_code
print r.json()
但您真正的问题是您为他们的 api 使用了错误的 header 键。是 App-Id
和 App-key
,而不是 App_Id
和 App_key
。它看起来像这样:
headers = {
'App-Id': 'xx',
'App-key': 'xxxx',
'Accept': 'application/json',
'Content-Type': 'application/json',
'Dev-Mode': 'true'}
data = {'text': 'i feel stomach pain but no coughing today'}
r = requests.post(url, headers=headers, data=json.dumps(data))
同样值得注意的是,他们有一个 python api 可以为您完成这一切。
我正在尝试向 API 提供商提出请求
curl "https://api.infermedica.com/dev/parse" \
-X "POST" \
-H "App_Id: 4c177c" -H "App_Key: 6852599182ba85d70066986ca2b3" \
-H "Content-Type: application/json" \
-d '{"text": "i feel smoach pain but no couoghing today"}'
此 curl 请求已得到响应。
但是当我尝试在代码中提出同样的请求
self.headers = { "App_Id": "4c177c", "App_Key": "6852599182ba85d70066986ca2b3", "Content-Type": "application/json", "User-Agent": "M$
self.url = "https://api.infermedica.com/dev/parse"
data = { "text": text }
json_data = json.dumps(data)
req = urllib2.Request(self.url, json_data.replace(r"\n", "").replace(r"\r", ""), self.headers)
response = urllib2.urlopen(req).read()
它给出
Traceback (most recent call last):
File "symptoms_infermedia_api.py", line 68, in <module>
SymptomsInfermedia().getResponse(raw_input("Enter comment"))
File "symptoms_infermedia_api.py", line 39, in getResponse
response = urllib2.urlopen(req).read()
File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 410, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 523, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 448, in error
return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 531, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden
json_data = json.dumps(data)
不是准备 POST 数据的正确方法。
您应该使用 urllib.urlencode()
来完成这项工作:
import urllib
data = { "text": text }
req = urllib2.Request(self.url, urllib.urlencode(data), self.headers)
response = urllib2.urlopen(req).read()
Docs:
class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable]) This class is an abstraction of a URL request.
data may be a string specifying additional data to send to the server, or None if no such data is needed. Currently HTTP requests are the only ones that use data; the HTTP request will be a POST instead of a GET when the data parameter is provided. data should be a buffer in the standard application/x-www-form-urlencoded format. The urllib.urlencode() function takes a mapping or sequence of 2-tuples and returns a string in this format.
这将是使用 python requests
库的等效请求。
url = "https://api.infermedica.com/dev/parse"
headers = {
'App_Id': '4c177c',
'App_Key': '6852599182ba85d70066986ca2b3',
'Content-Type': 'application/json',
}
data = {'text': 'i feel stomach pain but no coughing today'}
r = requests.post(url, headers=headers, data=json.dumps(data))
print r.status_code
print r.json()
但您真正的问题是您为他们的 api 使用了错误的 header 键。是 App-Id
和 App-key
,而不是 App_Id
和 App_key
。它看起来像这样:
headers = {
'App-Id': 'xx',
'App-key': 'xxxx',
'Accept': 'application/json',
'Content-Type': 'application/json',
'Dev-Mode': 'true'}
data = {'text': 'i feel stomach pain but no coughing today'}
r = requests.post(url, headers=headers, data=json.dumps(data))
同样值得注意的是,他们有一个 python api 可以为您完成这一切。