Python3模拟curl发送POST请求:使用http.client处理特定接口

小满
小满
发布时间:2026-10-11 | 3人浏览过
原创

本文介绍如何在Python3中模拟curl命令发送POST请求。通过http.client库,可以精确控制请求头(如Content-type)和请求体,解决直接使用requests库可能遇到的问题。示例展示了如何构建包含TYPE和DATA字段的JSON数据,并处理响应状态及内容。

Python3模拟curl发送POST请求操作示例

在开发过程中,有时需要模拟curl命令的行为来与后端接口进行交互。特别是当后端接口对Content-Type有特定要求,或者直接使用requests库发送POST请求失败时,使用Python内置的http.client库是一个有效的替代方案。

curl命令分析

假设后端接口URL为http://65.33.44.43:509/pre/update,curl命令可能如下所示:

curl -X POST -H "Content-Type: text/json" -d '{"TYPE": "PRE-FILTER_UPDATE", "DATA": [{"SN": "xxx", "MODEL": "yyy"}]}' http://65.33.44.43:509/pre/update -0 -v

该命令的关键点包括:

  • 设置Content-Type为text/json。
  • 数据主体包含TYPE和DATA字段。
  • 使用-d参数传递JSON数据。
  • 使用-0参数(可能用于特定协议处理)。
  • 使用-v参数进行详细输出。

Python实现

在Python中,我们可以使用http.client库来模拟上述curl命令。以下是一个示例函数selectAuth,它接收sn和dev_model参数,并发送POST请求:

import http.client
import json
import logging

# 假设log已经定义并配置
def selectAuth(self, sn, dev_model):
    try:
        # 构建JSON数据
        params = json.dumps({
            "TYPE": "PRE-FILTER_UPDATE",
            "DATA": [{"SN": str(sn.upper()), "MODEL": str(dev_model)}]
        })
        log.debug(params)
        
        # 设置请求头
        headers = {
            "Content-type": "text/json",
            "Accept": "text/plain"
        }
        
        # 创建HTTP连接
        conn = http.client.HTTPConnection("65.33.44.43:509", 509)
        
        # 发送POST请求
        conn.request('POST', '/pre/update', params, headers)
        
        # 获取响应
        response = conn.getresponse()
        code = response.status
        reason = response.reason
        log.debug(code)
        log.debug(reason)
        
        # 读取并解析响应数据
        data = json.loads(response.read().decode('utf-8'))
        
        # 关闭连接
        conn.close()
    except Exception as e:
        data = e
        log.error(e)
    
    log.debug('data:{},{}'.format(data, type(data)))
    return data

关键点说明

  • Content-type设置:通过headers字典明确指定Content-type为text/json,这与curl命令中的-H参数作用相同。
  • JSON数据处理:使用json.dumps将Python字典转换为JSON字符串,作为请求体发送。
  • 响应处理:通过response.read().decode('utf-8')获取响应内容,并使用json.loads解析为Python对象。
  • 异常处理:使用try-except块捕获可能的异常,并记录错误日志。

注意事项

虽然http.client库提供了底层控制,但需要注意的是,它不提供像requests库那样的高级功能(如自动重定向、会话保持等)。因此,在选择使用http.client时,需要确保其满足项目需求。

以上就是Python3模拟curl发送POST请求操作示例的详细内容,更多关于Python网络编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表