简体   繁体   English

使用urllib发出发布请求

[英]Making post request using urllib

I am trying to make request on API provider 我正在尝试向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"}'    

This curl request gives response. 该卷曲请求给出响应。

But same request when I try to make in code 但是当我尝试使用代码进行相同的请求时

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()

It gives 它给

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

This would be the equivalent request using the python requests library. 这将是使用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()

But your real problem is that you're using the wrong header keys for their api. 但是,您真正的问题是您为其API使用了错误的标题键。 It's App-Id and App-key , not App_Id and App_key . 它是App-IdApp-key ,不是App_IdApp_key It would look like this: 它看起来像这样:

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))

Also worth noting, they have a python api that does all this for you. 同样值得注意的是,他们有一个python API为您完成所有这些工作。

json_data = json.dumps(data) is not the correct way to prepare POST data. json_data = json.dumps(data)不是准备POST数据的正确方法。

You should use urllib.urlencode() to do the job: 您应该使用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. 类urllib2.Request(url [,data] [,headers] [,origin_req_host] [,unverifiable])此类是URL请求的抽象。

data may be a string specifying additional data to send to the server, or None if no such data is needed. data可以是一个字符串,用于指定要发送到服务器的其他数据;如果不需要,则为None。 Currently HTTP requests are the only ones that use data; 当前,HTTP请求是唯一使用数据的请求。 the HTTP request will be a POST instead of a GET when the data parameter is provided. 提供data参数时,HTTP请求将是POST而不是GET。 data should be a buffer in the standard application/x-www-form-urlencoded format. 数据应为标准application / x-www-form-urlencoded格式的缓冲区。 The urllib.urlencode() function takes a mapping or sequence of 2-tuples and returns a string in this format. urllib.urlencode()函数采用2元组的映射或序列,并以这种格式返回字符串。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM