2017-09-05 62 views
0

我想有以下特点来访问API:Python的开放,需要登录API https协议

协议:HTTPS

方法:“GET”

网址:“https://api.wmcloud.com/data/v1//api/equity/getEqu.json?field=&listStatusCD=&secID=&ticker=&equTypeCD=A 头:“授权:持票人<代币>“

所以,如果我只是打开网址,我可以看到所有的数据。另一方面,我的代码访问它不起作用。我的代码是:

import httplib 
httpClient = httplib.HTTPSConnection('api.wmcloud.com', '443',timeout=60) 
url = 'https://api.wmcloud.com/data/v1//api/equity/getEqu.json?field=&listStatusCD=&secID=&ticker=&equTypeCD=A' 
token='ae8820c8eb8ccd418dd8141b4c685d2d208c58a564a9fd2c22f8c95ac6a2ef23' 
alldata = httpClient.request('GET', url, headers={"Authorization": "Bearer " + token}) 

打印所有数据时它返回无。

回答

0

@yorah已经找到了问题的根本原因:为了发送HTTP请求,需要调用getresponse()

由于OP使用Python 2和@ yorah的代码是在Python 3中,这可能不是在OP的环境中工作,我想在下面的Python 2修复和重构的解决方案:

import httplib, urllib, json 
conn = httplib.HTTPSConnection("api.wmcloud.com", 443, timeout=60) 
token = "ae8820c8eb8ccd418dd8141b4c685d2d208c58a564a9fd2c22f8c95ac6a2ef23" 
headers = {"Authorization": "Bearer " + token} 
params = urllib.urlencode({"listStatusCD": "L", "secID": "000001.XSHE", "ticker":"000001", "equTypeCD": "A"}) 
conn.request("GET", "/data/v1/api/equity/getEqu.json?" + params, "", headers) 
r1 = conn.getresponse() 
print r1.status, r1.reason 
result = json.load(r1) 
print len(result['data']) # Expect: 1 

请请注意,加载响应数据需要一些时间。

对于Python 2中的相关文档,请参考https://docs.python.org/2.6/library/httplib.html

+0

感谢一堆。它似乎在工作。 但是,当我尝试传入更多参数时,它似乎不影响任何内容。 我将参数更改为: 'params = urllib.urlencode({“field”:“&”,“listStatusCD”:“L”,“secID”:“000001.XSHE”,“ticker”:“000001”, “equTypeCD”:“A”})',但输出仍然是整个人口。 有趣的是,当打印这个参数时,我发现“ticker”总是在“secID”的前面,而在它后面的代码中。 输出:'field =%26&listStatusCD = L&ticker = 000001&secID = 000001.XSHE&equTypeCD = A' – Liam

+0

@Liam参数过滤器不起作用,因为它应该包含在URL中,而不是'body'。我已经更新了我的答案,请检查。 – shaochuancs

+0

参数序列无关紧要。另外,由于没有'field'参数值,它不应该被包含在'params'中''&'是用于分隔URL中多个参数的字符,它不是参数值的一部分。 – shaochuancs

0

来源:https://docs.python.org/3/library/http.client.html


发送request后,您还需要:

  • 得到的回应
  • 读取响应(并对其进行解码)

以下应该做你想要的:

import httplib 
httpClient = http.client.HTTPSConnection('api.wmcloud.com', '443', timeout=60) 
url = 'https://api.wmcloud.com/data/v1//api/equity/getEqu.json?field=&listStatusCD=&secID=&ticker=&equTypeCD=A' 
token='ae8820c8eb8ccd418dd8141b4c685d2d208c58a564a9fd2c22f8c95ac6a2ef23' 
httpClient.request('GET', url, headers={'Authorization': 'Bearer ' + token}) 

alldata = httpClient.getresponse() 

print(alldata.read().decode())