python-如何调试请求库?
作者:互联网
我正在尝试将python脚本从通过os.system()发出curl命令转换为使用请求.我以为我会用pycurl,但this question还是说服了我.问题是我从服务器返回错误,使用r.text(from this answer)时可以看到,但我需要更多信息.是否有更好的方法调试发生的情况?
对于值得的事情,我认为这个问题围绕将我的–data标志从curl / pycurl转换为请求而解决.我已经创建了一个字典,其中包含我之前传递给–data的参数.我的猜测是其中之一是无效的,但是我如何才能确定更多信息呢?
例:
headers2 = {"Accept":"*/*", \
"Content-Type":"application/x-www-form-urlencoded", \
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36", \
"Origin":"https://somedomain.com", \
"X-Requested-With":"XMLHttpRequest", \
"Connection":"keep-alive", \
"Accept-Language":"en-US,en;q=0.8", \
"Referer":"https://somedomain.com/release_cr_new.html?releaseid=%s&v=2&m=a&prev_release_id=%s" % (current_release_id, previous_release_id), \
"Host":"somedomain.com", \
"Accept-Encoding":"gzip,deflate,sdch", \
"Cookie":'cookie_val'}
for bug_id in ids:
print bug_id
data = {'dump_json':'1','releaseid':current_release_id, 'v':'2','m':'a','prev_release_id': previous_release_id,'bug_ids': bug_id, 'set_cols':'sqa_status&sqa_updates%5B0%5D%5Bbugid%5D=' + bug_id + '&sqa_updates%5B0%5D%5Bsqa_status%5D=6'}
print 'current_release_id' , data['releaseid']
print 'previous_release_id', data['prev_release_id']
r = requests.post(post_url, data=json.dumps(data), headers=headers2)
print r.text
我得到的输出是相当普通的html消息,当我以错误的方式查询服务器时,我已经看到过.所以我知道我至少要到达正确的服务器.
我真的没有期待任何输出.这应该只是发布到服务器并更新数据库中的字段.
解决方法:
http响应的剖析
示例(加载此页面)
HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Fri, 27 Sep 2013 19:22:41 GMT
Last-Modified: Fri, 27 Sep 2013 19:21:41 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Fri, 27 Sep 2013 19:21:41 GMT
Content-Length: 12706
<!DOCTYPE html>
<html>
... truncated rest of body ...
>第一行是状态行,由状态代码和状态文本组成.
>标头是键/值对.标头以空的新行结束.空行表示没有更多的标头,并且紧随其后的是有效负载/主体.
>正文将消耗其余的消息.
下面说明如何提取这三个部分:
状态线
使用以下命令获取从服务器发送回的状态行
>>> bad_r = requests.get('http://httpbin.org/status/404')
>>> bad_r.status_code
404
>>> bad_r.raise_for_status()
Traceback (most recent call last):
File "requests/models.py", line 832, in raise_for_status
raise http_error
requests.exceptions.HTTPError: 404 Client Error
标头:
r = requests.get('http://en.wikipedia.org/wiki/Monty_Python')
# response headers:
r.headers
# request headers:
r.request.headers
身体
使用r.text.
发布请求编码
您在请求中发送给服务器的“内容类型”应与您实际发送的内容类型匹配.在您的情况下,您正在发送json,但告诉服务器您正在发送表单数据(如果未指定,则为默认值).
从上面显示的标题中:
“ Content-Type”:“应用程序/ x-www-form-urlencoded”,
但是您的request.post调用设置了data = json.dumps(data),它是JSON.标头应显示:
“ Content-type”:“ application / json”,
标签:curl,python-requests,python 来源: https://codeday.me/bug/20191030/1967371.html