如何通过请求和Python查询和登录Bill.com API?

时间:2016-10-31 14:46:15

标签: python rest api

我想查询并登录Bill.com via their REST API。在过去,下面的代码工作,但现在我收到一个新错误,我不确定如何基于Bill.com API Login documentation进行修复。

login_end_point='https://api.bill.com/api/v2/Login.json?'
login_params_dict = {'userName': username, 'password': password, 'orgId': orgId, 'devKey': devKey}
result = requests.get(login_end_point, params=login_params_dict).json()

过去,这种用法可以很好地工作,但现在我收到以下错误代码:

{u'response_status': 1, u'response_message': u'Error', u'response_data': {u'error_message': u'HTTP Method not supported.', u'error_code': u'BDC_1340'}}

我也尝试过以下操作,但仍然收到错误:

尝试不同的login_end_point:

login_end_point='https://api.bill.com/api/v2/'
login_params_dict = {'userName': username, 'password': password, 'orgId': orgId, 'devKey': devKey}
result = requests.get(login_end_point, params=login_params_dict).json()

尝试登录_end_point并发帖而不是获取:

login_end_point='https://api.bill.com/api/v2/'
login_params_dict = {'userName': username, 'password': password, 'orgId': orgId, 'devKey': devKey}
result = requests.post(login_end_point, params=login_params_dict).json()

这两次尝试都会返回此错误:

{u'response_status': 1, u'response_message': u'Error', u'response_data': {u'error_message': u'API not supported.', u'error_code': u'BDC_1121'}}

我也尝试了以下内容:

login_end_point= 'https://api.bill.com/api/v2/Login.json'
login_params_dict = {'userName': username, 'password': password, 'orgId': orgId, 'devKey': devKey}
result = requests.post(login_end_point, params=login_params_dict).json()

但这会返回以下错误:

{u'response_status': 1, u'response_message': u'Error', u'response_data': {u'error_message': u'Invalid request. Check query string parameters.', u'error_code': u'BDC_1339'}}

最后,我尝试使用http而不是https

进行以下操作
login_end_point= 'http://api.bill.com/api/v2/Login.json'
login_params_dict = {'userName': username, 'password': password, 'orgId': orgId, 'devKey': devKey}
result = requests.post(login_end_point, params=login_params_dict).json()

但是这会返回以下错误:

requests.exceptions.ConnectionError: HTTPConnectionPool(host='api.bill.com', port=80): Max retries exceeded with url: /api/v2/Login.json?userName=%40Cue.com&devKey=01NZ&password=DoC&orgId=00(Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x106602b90>: Failed to establish a new connection: [Errno 60] Operation timed out',))

2 个答案:

答案 0 :(得分:0)

根据您链接的文档:

  

不要将用户名和密码作为查询参数发送,因为它不安全,即不要将您的参数作为URL的一部分传递(/Login.json?userName=X&password=Y),也不要传递参数作为GET请求。

     

相反,使用POST代替GET并将参数存储在请求正文中。

     

对于所有登录调用,GET请求以及包含URL中的参数而不是请求正文的任何​​POST请求都将被拒绝。

您需要执行POST请求并将登录数据存储在请求正文中。

在您的代码中,您应该将登录数据作为json参数而不是params传递:

login_end_point= 'https://api.bill.com/api/v2/Login.json'
login_params_dict = {'userName': username, 'password': password, 'orgId': orgId, 'devKey': devKey}
result = requests.post(login_end_point, json=login_params_dict)

请注意,如果您使用的是旧版本的请求(&lt; 2.4.2),则应自行编码数据:

result = requests.post(login_end_point, data=json.dumps(login_params_dict))

Requests docs

答案 1 :(得分:0)

不要忘记以formdata而不是json body的形式发送!