You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:47:46