我想查询并登录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',))
答案 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))
答案 1 :(得分:0)
不要忘记以formdata而不是json body的形式发送!