【问题标题】:POST method in Python: errno 104Python中的POST方法:errno 104
【发布时间】:2017-09-26 09:11:54
【问题描述】:

我正在尝试用 Python 查询网站。我需要使用 POST 方法(根据我使用开发人员工具监视浏览器时发生的情况)。

如果我用 cURL 查询网站,效果很好:

curl -i --data "param1=var1&param2=var2" http://www.test.com

我得到了这个标题:

HTTP/1.1 200 OK
Date: Tue, 26 Sep 2017 08:46:18 GMT
Server: Apache/1.3.33 (Unix) mod_gzip/1.3.26.1a mod_fastcgi/2.4.2 PHP/4.3.11
Transfer-Encoding: chunked
Content-Type: text/html

但是当我在 Python 3 中执行此操作时,我收到错误 104。

这是我到目前为止所尝试的。首先,使用urllib(从this thread 获得灵感,设法使用 POST 方法而不是 GET):

import re
from urllib import request as ur

# URL to handle request                                                                                      
url = "http://www.test.com"
data = "param1=var1&param2=var2"

# Build a request dictionary
preq = [re.findall("[^=]+", i) for i in re.findall("[^\&]+", data)]
dreq = {i[0]: i[1] if len(i) == 2 else "" for i in preq}

# Initiate request & add method
ureq = ur.Request(url)                                                                                     
ureq.get_method = lambda: "POST"                                                                           
# Send request                                                                                             
req = ur.urlopen(ureq, data=str(dreq).encode())                                                            

我对@9​​87654326@的做法基本相同:

import re
import requests

# URL to handle request                                                                                      
url = "http://www.test.com"
data = "param1=var1&param2=var2"

# Build a request dictionary
preq = [re.findall("[^=]+", i) for i in re.findall("[^\&]+", data)]
dreq = {i[0]: i[1] if len(i) == 2 else "" for i in preq}

# Initiate request & add method
req = requests.post(url, data=dreq)                                                            

在这两种情况下,我都会收到 HTTP 104 错误:

ConnectionResetError: [Errno 104] Connection reset by peer

我不明白,因为相同的请求正在使用 cURL。我想我误解了 Python 请求的一些内容,但到目前为止我被卡住了。任何提示将不胜感激!

【问题讨论】:

    标签: python http-post python-requests urllib


    【解决方案1】:

    我刚刚发现我没有以正确的格式传递数据。我认为它需要存储在dict;事实并非如此,因此它比我之前尝试的要简单得多。

    urllib:

    req = ur.urlopen(ureq, data=str(data).encode())
    

    requests:

    req = requests.post(url, data=data)
    

    【讨论】:

      猜你喜欢
      • 2016-03-03
      • 1970-01-01
      • 2014-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 2018-05-22
      相关资源
      最近更新 更多