Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模拟HTTP POST请求会产生意外的结果_Python_Http_Post_Firebug_Python Requests - Fatal编程技术网

Python 模拟HTTP POST请求会产生意外的结果

Python 模拟HTTP POST请求会产生意外的结果,python,http,post,firebug,python-requests,Python,Http,Post,Firebug,Python Requests,---已解决--- 结果表明,请求主体中有文本r“\n”(repr:“\\n”)字符,由于我只是将主体复制粘贴为Python字符串,Python认为我给它的是换行符,而不是转义的换行符 这导致错误请求的原因如下:因此主体是JSON,在JSON中,必须根据定义转义所有换行符。因此,当服务器从原始文本加载JSON对象时,会抛出一个错误,导致错误请求 我意识到这一点是因为在这两种情况下,内容长度标题是不同的(\n是一个字符,\\\n是两个字符,尽管内容长度实际上可能并不重要 另外值得注意的是,当发送较

---已解决---

结果表明,请求主体中有文本
r“\n”
(repr:
“\\n”
)字符,由于我只是将主体复制粘贴为Python字符串,Python认为我给它的是换行符,而不是转义的换行符

这导致
错误请求的原因如下:因此主体是JSON,在JSON中,必须根据定义转义所有换行符。因此,当服务器从原始文本加载JSON对象时,会抛出一个错误,导致
错误请求

我意识到这一点是因为在这两种情况下,内容长度标题是不同的(
\n
是一个字符,
\\\n
是两个字符,尽管内容长度实际上可能并不重要

另外值得注意的是,当发送较低的内容长度时,也会返回
错误请求
。我认为这是因为JSON正文被截断,服务器不接受重要字符(例如右括号或其他)


---问题:---

摘要:

我正在尝试使用Python模拟在Firefox web浏览器中对bitbucket.org执行的POST请求。以下是我所做的:

  • 使用Firebug跟踪POST请求
  • 复制了POST请求标题
  • 复制了POST请求正文(应用程序/json格式)

  • 代码:

    这是我用来发布请求的代码,但是有点长,不太相关。我的内容类型是application/json,我的帖子正文是一个json编码的字符串

        dataString = '{"branch":"master","files":[{"path":"readme.txt","content":"ntestxx\n \n"}],"message":"readme.txt edited online with Bitbucket","parents":["465305dc4da32f91da057b65297cda9b72c"],"repository":{"full_name":"minesite/ica-i18n"},"timestamp":"2014-03-20T23:49:29.759Z","transient":false}'
        headers = {'X-CSRFToken': '6TqWjCl698U99Iu6ZYGBAloCxZ', 'Content-Length': '2190', 'Accept-Language': 'en,en-us;q=0.7,zh;q=0.3', 'X-NewRelic-ID': 'VwMGVVZSGwIIUFBQDwU=, VwMGVVZSGwIIUFBQDwU=', 'Cookie': 'csrftoken=6TqWjCl698U99Iu6ZYGBAloCxZ; __utma=254090395.1171276563.1394767875.1394776803.1395358874.3; __utmc=254090395; __utmz=254090395.1394776803.2.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); bb_session=gpqergylgoa7icpwosqsbpxig0; __utmv=254090395.|1=isBBUser=true=1; recently-viewed-repos_1701252=3802872%2C108928; __utmb=254090395.21.9.1395359363952', 'Connection': 'keep-alive', 'Accept': 'application/json, text/javascript, */*; q=0.01', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0', 'Host': 'bitbucket.org', 'X-Requested-With': 'XMLHttpRequest', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'Referer': 'https://bitbucket.org/xxxxxx/xxxxxxx/src/465305dc4da32f91da057b6529a8e4/readme.txt?at=master', 'Content-Type': 'application/json; charset=UTF-8', 'Accept-Encoding': 'gzip, deflate'}
        edit = requests.post("https://bitbucket.org/!api/internal/repositories/xxxxxxx/xxxxxxxx/oecommits/", data=dataString, headers=headers)
    

    结果与预期结果对比:

    当我使用Firefox web浏览器(使用Firebug的“重新发送请求”功能)执行POST请求时,我得到一个409冲突响应(这是所需的响应!我正在模拟对在线编辑器的请求,因此这应该是对重新发送的编辑的正确响应)

    然而,当我试图通过复制请求头和请求体来模拟请求时,我得到了400个错误的请求响应,而响应中不包含任何其他信息,因此我甚至不知道我的问题是什么

    无论我在web浏览器中发送帖子多少次(尽管时间戳不正确),它都会达到预期效果,但服务器拒绝接受我使用python请求库发出的任何请求


    使用浏览器请求的响应:

    标题

    HTTP/1.1 409 CONFLICT
    Server: nginx/1.5.10
    Date: Fri, 21 Mar 2014 00:20:55 GMT
    Content-Type: text/plain
    Content-Length: 45
    Connection: keep-alive
    x-served-by: app16
    X-Render-Time: 0.558492183685
    Content-Language: en
    X-Static-Version: 48695e7c3140
    Vary: Authorization, Accept-Language, Cookie
    X-Version: e6778a5040f7
    Etag: "92f0b780984e984140de0f8ed0a3992c"
    X-Frame-Options: SAMEORIGIN
    X-Request-Count: 483
    X-NewRelic-App-Data: PxQEVFdXCAITVVlWBgMPUkYdFGQHBDcQUQxLA1tMXV1dSn8UXwJHCwtYGAMPF1pGUw8EFhlQRxYXH1dDC0gKDEQHSgxZVBpaUgtdDVQTQFgrWFsICAZ9V1kQIg1aXF4SLFBYVw4DEUxTEF0DTF0WHgNJCU8EVApUUgUHVFFQCgQCU1FXGwMGX1QdFAEBUVVbA1AJVQEBB1FSA11DHQdSDhdTag==
    
    content-length: 11
    x-served-by: app10
    x-render-time: 0.012787103653
    content-language: en
    content-type: text/plain
    vary: Authorization, Accept-Language, Cookie
    connection: keep-alive
    server: nginx/1.5.10
    x-version: e6778a5040f7
    etag: "825644f747baab2c00e420dbbc39e4b3"
    x-request-count: 321
    x-newrelic-app-data: PxQEVFdXCAITVVlWBgMPUkYdFGQHBDcQUQxLA1tMXV1dSn8UXwJHCwtYGAMPF1pGUw8EFhlQRxYXH1dDC0gRB0MNTRBbXQ5gVhZWFEMCVkBIBhtRSFMJAARQUlsDBw9VXAIBC1tWVU4CUwtUFBpVAwFcWgdTVQIAXQBRWQQAGh9WBQ0RUmw=
    date: Fri, 21 Mar 2014 00:51:01 GMT
    x-frame-options: SAMEORIGIN
    x-static-version: 48695e7c3140
    
    身体


    使用python请求的响应:

    标题

    HTTP/1.1 409 CONFLICT
    Server: nginx/1.5.10
    Date: Fri, 21 Mar 2014 00:20:55 GMT
    Content-Type: text/plain
    Content-Length: 45
    Connection: keep-alive
    x-served-by: app16
    X-Render-Time: 0.558492183685
    Content-Language: en
    X-Static-Version: 48695e7c3140
    Vary: Authorization, Accept-Language, Cookie
    X-Version: e6778a5040f7
    Etag: "92f0b780984e984140de0f8ed0a3992c"
    X-Frame-Options: SAMEORIGIN
    X-Request-Count: 483
    X-NewRelic-App-Data: PxQEVFdXCAITVVlWBgMPUkYdFGQHBDcQUQxLA1tMXV1dSn8UXwJHCwtYGAMPF1pGUw8EFhlQRxYXH1dDC0gKDEQHSgxZVBpaUgtdDVQTQFgrWFsICAZ9V1kQIg1aXF4SLFBYVw4DEUxTEF0DTF0WHgNJCU8EVApUUgUHVFFQCgQCU1FXGwMGX1QdFAEBUVVbA1AJVQEBB1FSA11DHQdSDhdTag==
    
    content-length: 11
    x-served-by: app10
    x-render-time: 0.012787103653
    content-language: en
    content-type: text/plain
    vary: Authorization, Accept-Language, Cookie
    connection: keep-alive
    server: nginx/1.5.10
    x-version: e6778a5040f7
    etag: "825644f747baab2c00e420dbbc39e4b3"
    x-request-count: 321
    x-newrelic-app-data: PxQEVFdXCAITVVlWBgMPUkYdFGQHBDcQUQxLA1tMXV1dSn8UXwJHCwtYGAMPF1pGUw8EFhlQRxYXH1dDC0gRB0MNTRBbXQ5gVhZWFEMCVkBIBhtRSFMJAARQUlsDBw9VXAIBC1tWVU4CUwtUFBpVAwFcWgdTVQIAXQBRWQQAGh9WBQ0RUmw=
    date: Fri, 21 Mar 2014 00:51:01 GMT
    x-frame-options: SAMEORIGIN
    x-static-version: 48695e7c3140
    
    身体


    我的一些想法:

    我在想,也许我需要模拟HTTP POST请求的另一个组件?也许当Firefox发送POST请求时,添加了一些头文件或包装,使请求有效

    或者POST请求除了方法、头和正文之外还有什么其他内容吗

    也许是因为它是HTTPS而不是HTTP


    更新:

    我试着将“发送的cookies”与请求一起发送,但收效甚微

    或者POST请求是否有比方法更重要的东西, 标题、标题和正文

    不是。重要的部分是请求头。它们在两种情况下应该完全相同

    因为Firebug可以只跟踪Firefox内部的网络请求,所以您需要一个外部网络分析器来跟踪来自Python脚本的请求。 当然,您需要在脚本所在的服务器上运行它

    另一个解决方案是对本地web服务器运行请求,并将请求信息记录在那里


    然后,您可以将浏览器中的请求与脚本中的请求进行比较。

    谢谢!我一定会尝试一下。我试过查看Wireshark,但有太多(似乎是编码的)数据包,我不知道应该读哪些数据包哦,是的。我错过了您正在访问HTTPS URL的消息。因此,您可以查看一下,以便能够解密请求信息。已解决!结果是我的请求正文被错误转录,导致内容长度头不正确。您的帮助太棒了,非常感谢