如何使用Python Requests库调用API

时间:2018-04-01 00:16:31

标签: python api python-requests

我无法弄清楚如何使用python urllib或者请求正确调用这个api。

让我给你现在的代码:

import requests
url = "http://api.cortical.io:80/rest/expressions/similar_terms?retina_name=en_associative&start_index=0&max_results=1&sparsity=1.0&get_fingerprint=false"
params = {"positions":[0,6,7,29]}
headers = { "api-key" : key,
            "Content-Type" : "application/json"}
# Make a get request with the parameters.
response = requests.get(url, params=params, headers=headers)

# Print the content of the response
print(response.content)

我甚至在其余的参数中加入了params变量:

url = 'http://api.cortical.io:80/rest/expressions/similar_terms?'
params = {
    "retina_name":"en_associative",
    "start_index":0,
    "max_results":1,
    "sparsity":1.0,
    "get_fingerprint":False,
    "positions":[0,6,7,29]}

我收到此消息:

  

已记录内部服务器错误@ Sun Apr 01 00:03:02 UTC   2018

所以我不确定我做错了什么。你可以在这里测试他们的api,但即使进行测试,我也无法弄明白。如果我转到http://api.cortical.io/,请点击表达式标签,点击 POST / expressions / similar_terms 选项,然后粘贴{“位置”:[0, 6,7,29]}在正文文本框中点击按钮,它会给你一个有效的回复,所以他们的API没有任何问题。

我不知道我做错了什么。你能救我吗?

2 个答案:

答案 0 :(得分:6)

问题在于您在params字典中混合查询字符串参数和发布数据。 相反,您应该为查询字符串数据使用params参数,并为帖子正文数据使用json参数(因为内容类型为json)。

使用json参数时,默认情况下Content-Type标头为'application / json' 此外,当响应为json时,您可以使用.json方法获取字典。

一个例子,

import requests

url = 'http://api.cortical.io:80/rest/expressions/similar_terms?'
params = {
    "retina_name":"en_associative",
    "start_index":0,
    "max_results":1,
    "sparsity":1.0,
    "get_fingerprint":False
}
data = {"positions":[0,6,7,29]}
r = requests.post(url, params=params, json=data)

print(r.status_code)
print(r.json())

200
[{'term': 'headphones', 'df': 8.991197733061748e-05, 'score': 4.0, 'pos_types': ['NOUN'], 'fingerprint': {'positions': []}}]

答案 1 :(得分:1)

所以,我不能说出为什么第三方API中存在服务器错误,但是我按照你的建议尝试直接使用API​​ UI,并注意到你正在使用完全不同的端点< / em>而不是您尝试在代码中调用的那个。在您的代码中,您GET来自http://api.cortical.io:80/rest/expressions/similar_terms,但在用户界面POSThttp://api.cortical.io/rest/expressions/similar_terms/bulk。这是苹果和橘子。

调用您在UI调用中提到的端点对我来说很有用,使用代码中的以下变体,这需要使用requests.post,并且正如t.m所指出的那样。 adam,有效负载的json参数,也需要包含在列表中:

import requests
url = "http://api.cortical.io/rest/expressions/similar_terms/bulk?retina_name=en_associative&start_index=0&max_results=1&sparsity=1.0&get_fingerprint=false"
params = [{"positions":[0,6,7,29]}]
headers = { "api-key" : key,
            "Content-Type" : "application/json"}
# Make a get request with the parameters.
response = requests.post(url, json=params, headers=headers)

# Print the content of the response
print(response.content)

给出:

b'[[{"term":"headphones","df":8.991197733061748E-5,"score":4.0,"pos_types":["NOUN"],"fingerprint":{"positions":[]}}]]'