【问题标题】:How to make HTTP POST request with pywin32 / pypiwin32?如何使用 pywin32 / pypiwin32 发出 HTTP POST 请求?
【发布时间】:2018-02-02 07:06:20
【问题描述】:

背景

我已经使用pypiwin32 成功发出了一些 HTTP GET 请求

import pythoncom
import win32com.client

pythoncom.CoInitialize()

h = win32com.client.Dispatch('WinHTTP.WinHTTPRequest.5.1')
h.SetAutoLogonPolicy(0) # log in automatically
h.Open('GET', url, True)
h.Send()

然后从h.status和h.responseText获取响应状态和文本

问题

pywin32(或者我应该说pypiwin32)似乎没有官方文档,Microsoft WinHttpRequest object docs 只有 C++ 示例。

问题

如何使用 pywin32 中的 win32com.client 发出带有特定负载和标头的 HTTP POST 请求?假设我要添加的 HTTP 请求标头是

Referer: http://example.com/analysis.aspx?ID=527776455
Cookie: ASP.NET_SessionId=51jrf2r

我要发布的有效负载是

{"Id":"8974552","Action":"Analysis"}

【问题讨论】:

  • 不会有更好的方法吗?因为跨平台和出色的文档。
  • 我确实需要h.SetAutoLogonPolicy(0) 提供的自动登录来进行Microsoft NTLM 身份验证。如果requests 可以做到这一点,我很乐意迁移。我也尝试过requests-ntml,但如果使用它,您似乎必须提供凭据。

标签: python pywin32 winhttprequest


【解决方案1】:
import pythoncom
import win32com.client

pythoncom.CoInitialize()

h = win32com.client.Dispatch('WinHTTP.WinHTTPRequest.5.1')
h.SetAutoLogonPolicy(0) # log in automatically

h.Open('POST', url, True)

h.SetRequestHeaders(Your_Headers)
h.Send("{"Id":"8974552","Action":"Analysis"}")

【讨论】:

    【解决方案2】:

    经过一些尝试和错误,我认为我做对了。这是使用httpbin 的示例。我发现使用 json.dumps() 非常方便,因为它会自动将 False 写为“false”,将 None 写为“null”。

    import json
    import win32com.client
    
    h = win32com.client.Dispatch('WinHTTP.WinHTTPRequest.5.1')
    h.Open('POST', 'http://httpbin.org/post', True)
    
    h.SetRequestHeader('Referer', 'http://example.com/analysis.aspx?ID=527776455')
    h.SetRequestHeader('Cookie', 'ASP.NET_SessionId=51jrf2r')
    
    payload = dict(
        Id = 8974552,
        Action = "Analysis",
        somebool = False,
        missing_parameter = None
    )
    
    h.Send(json.dumps(payload))
    
    print(h.responseText)
    

    这里是打印命令的输出,去掉了 IP 地址:

    {
      "args": {},
      "data": "{\"Id\": 8974552, \"Action\": \"Analysis\", \"somebool\": false, \"missing_parameter\": null}",
      "files": {},
      "form": {},
      "headers": {
        "Accept": "*/*",
        "Connection": "close",
        "Content-Length": "83",
        "Content-Type": "text/plain; Charset=UTF-8",
        "Cookie": "ASP.NET_SessionId=51jrf2r",
        "Host": "httpbin.org",
        "Referer": "http://example.com/analysis.aspx?ID=527776455",
        "User-Agent": "Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)"
      },
      "json": {
        "Action": "Analysis",
        "Id": 8974552,
        "missing_parameter": null,
        "somebool": false
      },
      "origin": "###.###.###.###",
      "url": "http://httpbin.org/post"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多