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

如何使用urllib正确编码GraphQL POST请求数据?

如何用urllib正确编码GraphQL POST请求?

你的问题出在请求体的编码格式和请求头设置错误:

  • requests的json=data参数会自动把字典序列化为JSON字符串,并设置请求头Content-Type: application/json,这符合GraphQL服务器的要求。
  • 而你用urllib.parse.urlencode()是把数据编码成了application/x-www-form-urlencoded(表单格式),服务器无法识别这种格式的GraphQL请求,所以返回400错误。

正确的做法是把数据序列化为JSON格式,并设置正确的请求头,具体实现如下:

import urllib.request
import json

url = "https://swapi-graphql.netlify.app/.netlify/functions/index"

data = {
    "query": "query MyQuery($pid: ID) {\n\tperson(id: $pid) {\n    name\n  }\n}",
    "variables": {
        "pid": "cGVvcGxlOjE="
    },
    "operationName": "MyQuery"
}

# 将字典序列化为JSON字符串,再编码为字节流
json_data = json.dumps(data).encode("utf-8")
# 创建Request对象,指定请求方法、请求体,同时添加Content-Type头
req = urllib.request.Request(
    url,
    data=json_data,
    method="POST",
    headers={"Content-Type": "application/json"}
)

with urllib.request.urlopen(req) as response:
    the_page = response.read()
print(the_page.decode("utf-8"))

关键说明:

  • 必须用json.dumps()把数据转成JSON字符串,而非urlencode,这和requests的json=data行为一致。
  • 必须显式设置Content-Type: application/json请求头,告诉服务器请求体是JSON格式——urllib不会自动帮你设置这个头,但requests的json参数会自动添加。

内容的提问来源于stack exchange,提问作者Him

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:47:23