Python3 使用urllib 发送application/json格式的post请求

在爬取某网站的时候,碰到的一个问题,
在进行一个post请求时,postman 里面可以正常请求到数据,但是一模一样放到python里面就不行了,后面通过抓包发现了问题。
直接贴代码:

raw = {‘number’: ‘123456’}
print(raw)
data = parse.urlencode(raw).encode(‘utf-8’)
request = urllib.request.Request(collectUserCoin_url, headers=headers, data=data)
response = urlopen(request)
html = response.read().decode(‘utf-8’)

如上这种方式,通过抓包发现,在进行post请求时,请求将data转换成了“number=123456”这种对象格式进行发送的。但是后台接收到之后解析不了,返回了{“code”:-1,”msg”:”请求出错”,”data”:null}

于是乎,通过postman 请求,然后抓包观察到,postman里面发出的请求,请求体的格式为 {“number”: “123456”} 这种标准的json形式。问题找到了,解决方案如下:

raw = {‘number’: ‘123456’}
print(raw)
data = json.dumps(raw)
data = bytes(data, ‘utf8’)
request = urllib.request.Request(collectUserCoin_url, headers=headers, data=data)
response = urlopen(request)
html = response.read().decode(‘utf-8’)

Python中,当你发送HTTP请求(如使用requests库)并且希望设置Content-Type为application/json时,你需要在发送请求时设置头部信息。以下是使用requests库的一个例子: ```python import requests # 定义你要发送的数据(这是一个字典,通常用于JSON格式) data = { "key": "value", "another_key": "another_value" } # 创建一个响应对象 response = requests.post('http://example.com/api', json=data, headers={'Content-Type': 'application/json'}) # 确保请求成功 if response.status_code == 200: print(response.json()) # 如果是json数据,可以在这里解析返回结果 else: print(f"请求失败,状态码:{response.status_code}") ``` 在这个示例中,`headers`是一个字典,键是头部字段(如'Content-Type'),值是对应的值。`json=data`会自动设置Content-Type为application/json,并将data作为JSON数据发送。 如果你使用的是更底层的如urllib库,也可以这样做: ```python from urllib.parse import urlencode import urllib.request url = 'http://example.com/api' data = {'key': 'value'} # 将字典转换为URL编码的字符串 data_str = urlencode(data) # 设置头部信息 headers = {'Content-Type': 'application/json'} # 发送POST请求 req = urllib.request.Request(url, data_str.encode(), headers=headers) with urllib.request.urlopen(req) as response: response_data = response.read().decode() print(response_data) ``` 同样要注意,这里也设置了Content-Type为application/json
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值