2013-09-27 39 views
2

我试图通过os.system()发出一个curl命令来转换我的python脚本来使用请求。我以为我会用pycurl,但this question否则说服了我。问题是我收到从使用r.text(from this answer)时可以看到的服务器返回的错误,但我需要更多信息。有没有更好的方法来调试发生了什么?如何调试请求库?

为什么它的价值我认为问题revoles围绕转换我的--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邮件。所以我知道我至少到达了正确的服务器。

我真的不期待任何输出。这应该只是发布到服务器并更新数据库中的一个字段。

+0

您可以发布一个例子(包括输入,预期的输出和实际输出)?你可能会指向http://httpbin.org/(如果你不想在那里发送数据,你可以在github上分发)。这可能有助于您调试差异。 –

+0

我试着用一个例子来更新它。我一开始很犹豫,因为我非常糟糕,在留下一些我应该掩盖的东西。 – Ramy

+0

我在编码方面玩了一下 - 完全没有改变的结果 – Ramy

回答

2

解剖学的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 ... 
  1. 的第一行是状态行和由状态代码状态文本的。
  2. 标题是键/值对。标题以空白的新行结束。空行表示没有更多头文件,并且后面是有效负载/正文的开头。
  3. body消耗剩余的消息。

下面介绍如何提取3个部分:

状态行

使用以下方法来获取状态行从服务器

>>> 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 

(source)

送回

插头:

r = requests.get('http://en.wikipedia.org/wiki/Monty_Python') 
# response headers: 
r.headers 
# request headers: 
r.request.headers 

身体

使用r.text

POST请求编码

的“内涵式”发送到请求应该与你实际发送的内容类型的服务器。在你的情况下,你发送json,但告诉服务器你发送表单数据(如果你没有指定,这是默认的)。

从标题你上面显示:

"Content-Type":"application/x-www-form-urlencoded",

但是你request.post调用设置data=json.dumps(data)这是JSON。标题应说:

"Content-type": "application/json",

+0

这太棒了!所以,我只是盲目地复制了'json.dumps'部分,form-urlencoded是正确的编码类型,我将其更改为'data = data',现在响应看起来更准确,但它并不完全符合我的期望。接受这个答案做更多的挖掘。 – Ramy