Python-requests之POST Data的json问题

代码如下:

import json
import requests
r = requests.post(url, data = {"a": json.dumps({"b": "c"})}); #url为随意URL

使用Fiddler抓包,虽然在WebForms里面看到格式如下:

但是在Raw中看到结果如下:

即自动执行了urlencode,查看requests/models.py源码发现,如果数据可迭代,即自动加入"application/x-www-form-urlencoded"头,并且执行urlencode:

PreparedRequest类的prepare_body方法中

if data:
    body = self._encode_params(data)
    if isinstance(data, basestring) or hasattr(data, ‘read‘):
        content_type = None
    else:
        content_type = ‘application/x-www-form-urlencoded‘

RequestEncodingMixin类中_encode_params(data)方法中

if isinstance(data, (str, bytes)):
    return data
elif hasattr(data, ‘read‘):
    return data
elif hasattr(data, ‘__iter__‘):
    result = []
    for k, vs in to_key_val_list(data):
        if isinstance(vs, basestring) or not hasattr(vs, ‘__iter__‘):
            vs = [vs]
        for v in vs:
            if v is not None:
                result.append(
                    (k.encode(‘utf-8‘) if isinstance(k, str) else k,
                     v.encode(‘utf-8‘) if isinstance(v, str) else v))
    return urlencode(result, doseq=True)
else:
    return data

解决办法:

import json
import requests

headers = {"Content-Type": "application/x-www-form-urlencoded"}
data = "a=%s" %  json.dumps({"b": "c"})
r = requests.post(url, data = data, headers = headers);
时间: 2024-10-11 12:57:59

Python-requests之POST Data的json问题的相关文章

深入requests库params|data|json参数

一.params params:字典或者字节序列,作为参数增加到URL中.不仅访问URL,还可以向服务器携带参数. 简单来讲也就是说对于原来的网址进行内容的提交形成新的url 举例演示 data ={ 'wd':'ywy', } rp = requests.get('https://www.baidu.com/s',params=data) print(rp.url) print('-'*200) rp_1 = requests.get('https://www.baidu.com/s?wd=y

python接口自动化测试十一:传参数:data与json

# 传json参数 import requests url = 'xxxxxxxx' body = {     'xxx': 'xxx',     'xxx': 'xxx' } # body是json格式的 r = requests.post(url, json=body) print(r.text) # 第二种方法 import json r = requests.post(url, data=json.dumps(body)) print(r.text)   import requests

Python requests

Python requests备忘 0x01 1 #coding:utf-8 2 import requests 3 4 res = requests.get('http://www.baidu.com') 5 print res.status_code 6 print res.headers['content-type'] #头部信息 7 print res.encoding #编码信息 8 print res.text9 print res.content 0x02 payload 1 im

python+requests实现接口测试 - get与post请求使用

简介:Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求.Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner.更重要的一点是它支持 Python3 哦! 一.安装 使pip安装: pip install requests 安装完后,运行一个简单的例子查看是否安装成功: impo

Python+Requests接口测试教程(2):requests

开讲前,告诉大家requests有他自己的官方文档:http://cn.python-requests.org/zh_CN/latest/ 2.1 发get请求 前言requests模块,也就是老污龟,为啥叫它老污龟呢,因为这个官网上的logo就是这只污龟,接下来就是学习它了.环境准备(小编环境):python:2.7.12pycharm:5.0.4requests:2.13.0(这学本篇之前,先要有一定的python基础,因为后面都是直接用python写代码了,小编主要以讲接口为主,pytho

python requests用法总结

requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到.可以说,Requests 完全满足如今网络的需求 本文全部来源于官方文档 http://docs.python-requests.org/en/master/ 安装方式一般采用$ pip install requests.其它安装方式参考官方文档 HTTP - requests import requests GET请求 r  = requests.get('http://httpbin.or

Python Requests库:HTTP for Humans

Python标准库中用来处理HTTP的模块是urllib2,不过其中的API太零碎了,requests是更简单更人性化的第三方库. 用pip下载: pip install requests 或者git: git clone git://github.com/kennethreitz/requests.git 发送请求: GET方法 >>> import requests >>> r = requests.get('https://api.github.com/event

Python Requests快速入门

快速上手 迫不及待了吗?本页内容为如何入门Requests提供了很好的指引.其假设你已经安装了Requests.如果还没有, 去 安装 一节看看吧. 首先,确认一下: Requests 已安装 Requests是 最新的 让我们从一些简单的示例开始吧. 发送请求 使用Requests发送网络请求非常简单. 一开始要导入Requests模块: >>> import requests 然后,尝试获取某个网页.本例子中,我们来获取Github的公共时间线 >>> r = re

Python requests模块学习笔记

1.Requests模块说明 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. 在Python的世界里,事情不应该这么麻烦. Requests 使用的是 urllib3,因此继承了它的所有特性.Request