如何使用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
相关产品推荐
相关产品推荐

