Python socket实现post请求

# -*- coding: utf-8 -*-
import socket
import time


strPost = "POST /bgdadmin/servlet/studentLogin HTTP/1.1\r\n" \
          "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*\r\n" \
          "Referer: http://yjsgl.bjut.edu.cn/bgdadmin/servlet/studentMain\r\n" \
          "Accept-Language: zh-cn\r\n" \
          "Content-Type: application/x-www-form-urlencoded\r\n" \
          "Accept-Encoding: gzip, deflate\r\n" \
          "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n" \
          "Host: yjsgl.bjut.edu.cn\r\n" \
          "Content-Length: 47\r\n" \
          "Connection: Keep-Alive\r\n" \
          "Cache-Control: no-cache\r\n" \
          "Cookie: JSESSIONID=DgxvXnRhLdSn65nfkyXv4wGXr8xQWb
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A: 构造 POST 请求体需要包含以下几个部分: 1. Content-Type,通常为 application/x-www-form-urlencoded 或 multipart/form-data,Content-Type 的值会影响请求体的构造。 2. 请求参数,即需要提交的参数内容。 以下是示例代码,可以构造一个 application/x-www-form-urlencoded 类型的 POST 请求体: ``` import socket host = 'example.com' port = 80 path = '/api' params = {'name': 'test', 'id': '123'} # 构造请求体 body = '' for key, value in params.items(): body += key + '=' + value + '&' body = body[:-1] # 构造请求头 headers = f'POST {path} HTTP/1.1\r\n' headers += f'Host: {host}\r\n' headers += 'Content-Type: application/x-www-form-urlencoded\r\n' headers += f'Content-Length: {len(body)}\r\n' headers += '\r\n' # 构造 POST 请求整体 request = headers + body # 建立连接并发送请求 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((host, port)) s.sendall(bytes(request, 'utf-8')) # 接收响应 response = s.recv(1024) print(response.decode()) ``` 以上代码中,params 变量是一个字典对象,其中存储了请求参数。在构造请求体时,将参数拼接成字符串,并用 & 符号分隔参数。Content-Type 被设置为 application/x-www-form-urlencoded,因此发送的请求体格式也应该为这种形式。 如果需要构造 multipart/form-data 类型的 POST 请求体,可以使用 Python 标准库中的 MultipartEncoder 类来实现。例如: ``` import socket from requests_toolbelt.multipart.encoder import MultipartEncoder host = 'example.com' port = 80 path = '/upload' params = {'name': 'test'} files = {'file': open('example.txt', 'rb')} # 构造 multipart/form-data 类型的请求体 m = MultipartEncoder(fields=params, files=files, boundary='boundary') # 构造请求头 headers = f'POST {path} HTTP/1.1\r\n' headers += f'Host: {host}\r\n' headers += f'Content-Type: {m.content_type}\r\n' headers += f'Content-Length: {m.len}\r\n' headers += '\r\n' # 构造 POST 请求整体 request = headers.encode() + m.to_string() # 建立连接并发送请求 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((host, port)) s.sendall(request) # 接收响应 response = s.recv(1024) print(response.decode()) ``` 以上代码使用 requests_toolbelt 模块的 MultipartEncoder 类来构造请求体,这种方式可以更加灵活地构造各种类型的请求体,需要注意的是,multipart/form-data 请求体中的参数和文件应当都被编码为字符串类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值