使用Python Socket发送JWT认证请求时返回400错误的问题
问题描述
我有一台接受JWT认证请求的Web服务器,尝试用Python的Socket编写客户端发送认证请求,但服务器返回400 - 错误请求。邮箱和密码为示例内容,确保正确。
服务器代码
from flask import Flask, request, abort app = Flask(__name__) @app.route("/auth", methods=["POST"]) def authenticate(): print(request) if request.method == "POST": email = request.json.get("email") password = request.json.get("password") print(request) if not email or not password: return 400 return 200 else: abort(400) if __name__ == "__main__": app.run(host='127.0.0.1', port=6000)
客户端代码
import socket HOST = "127.0.0.1" # The server's hostname or IP address PORT = 6000 # The port used by the server with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b"POST /auth HTTP/1.1\r\nHost:127.0.0.1:6000\r\nContent-Type: application/json \r\n") s.sendall(b"email=test@test.com&password=p455\r\n\r\n") data = s.recv(1024) print(f"Received {data}")
问题原因及修复方案
问题分析
服务器通过request.json.get()获取参数,说明它期望JSON格式的请求体,但客户端发送的是email=test@test.com&password=p455这种表单格式内容,同时HTTP请求还存在两个问题:
Content-Type头后多了一个空格,可能导致服务器无法正确识别内容类型- 缺少
Content-Length头,HTTP/1.1要求POST请求必须指定请求体长度,否则服务器可能无法正确解析请求体
修复后的客户端代码
import socket import json HOST = "127.0.0.1" PORT = 6000 # 构造JSON格式的请求体并编码为字节流 payload = json.dumps({"email": "test@test.com", "password": "p455"}).encode('utf-8') with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) # 构造符合规范的HTTP请求头 request_headers = ( f"POST /auth HTTP/1.1\r\n" f"Host: {HOST}:{PORT}\r\n" f"Content-Type: application/json\r\n" f"Content-Length: {len(payload)}\r\n" f"\r\n" ).encode('utf-8') # 依次发送请求头和请求体 s.sendall(request_headers) s.sendall(payload) data = s.recv(1024) print(f"Received {data.decode('utf-8')}")
修复说明
- 将请求体转换为JSON格式,确保与服务器预期的参数格式匹配
- 修正
Content-Type头,移除多余空格,保证服务器能正确识别内容类型 - 添加
Content-Length头,告知服务器请求体的字节长度,确保请求被完整解析
内容的提问来源于stack exchange,提问作者mazix
相关产品推荐
相关产品推荐

