1 问题描述

欲使用Python的requests库(requests.session().request(...))实现对此Ajax的POST请求进行模拟实现。

但在chrome发现其请求的形式不一样,是以前从未注意到的————Request Payoad形式,请求的参数也有一些诡异————并非 json 或者 key=value 这类标准的键-值型请求数据,而是 纯文本(`[11626301]`)。

发现其Ajax在POST数据时,使用的数据格式是request payload,有别于之前常见的 POST数据格式(Form data)。而使用Form data数据的提交方式时,无法提交成功。


2 问题分析

2.1 request payloa VS form data

HTTP请求中的form data和request payload的区别

AJAX Post请求中常用的2种传参数的形式:form data 和 request payload

2.1.1 for-data

get请求】时,则:表单参数(请求数据集)直接可反映在url中,形式为key1=value1&key2=value2形式,比如:

http://news.baidu.com/ns?word=NBA&tn=news&from=news&cl=2&rn=20&ct=1

post请求】时,则:表单参数(请求数据集)是在请求体body中,也是以key1=value1&key2=value2的形式在请求体中。

通过chrome的开发者工具可以看到如下:

RequestURL:http://127.0.0.1:8080/test/test.do
Request Method:POST
Status Code:200 OK Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:25
Content-Type:application/x-www-form-urlencoded
Cookie:JSESSIONID=74AC93F9F572980B6FC10474CD8EDD8D
Host:127.0.0.1:8080
Origin:http://127.0.0.1:8080
Referer:http://127.0.0.1:8080/test/index.jsp
User-Agent:Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36 Form Data
name:mikan
address:street Response Headers
Content-Length:2
Date:Sun, 11 May 2014 11:05:33 GMT
Server:Apache-Coyote/1.1

这里要注意post请求的Content-Type为application/x-www-form-urlencoded(默认的),参数是在请求体中,即上面请求中的Form Data。

[前端]:

xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send("name=foo&value=bar");

在servlet中,可以通过request.getParameter(name)的形式来获取表单参数。

/**
* 获取httpRequest的参数
*
* @param request
* @param name
* @return
*/
protected String getParameterValue(HttpServletRequest request, String name) {
return StringUtils.trimToEmpty(request.getParameter(name));
}

2.1.2 Request payload

如果使用原生AJAX POST请求的话,那么请求在chrome的开发者工具的表现如下,主要是参数在

Remote Address:192.168.234.240:80
Request URL:http://tuanbeta3.XXX.com/qimage/upload.htm
Request Method:POST
Status Code:200 OK Request Headers
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Connection:keep-alive
Content-Length:151
Content-Type:application/json;charset=UTF-8
Cookie:JSESSIONID=E08388788943A651924CA0A10C7ACAD0
Host:tuanbeta3.XXX.com
Origin:http://tuanbeta3.XXX.com
Referer:http://tuanbeta3.XXX.com/qimage/customerlist.htm?menu=19
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
X-Requested-With:XMLHttpRequest Request Payload
[{widthEncode:NNNcaXN, heightEncode:NNNN5NN, displayUrl:201409/03/66I5P266rtT86oKq6,…}] Response Headers
Connection:keep-alive
Content-Encoding:gzip
Content-Type:application/json;charset=UTF-8
Date:Thu, 04 Sep 2014 06:49:44 GMT
Server:nginx/1.4.7
Transfer-Encoding:chunked
Vary:Accept-Encoding

【注意】:请求的Content-Typeapplication/json;charset=UTF-8,而请求表单参数在Request Payload中。

后端获取(这里使用org.apache.commons.io.):

/**
* 从 request 获取 payload 数据
*
* @param request
* @return
* @throws IOException
*/
private String getRequestPayload(HttpServletRequest request) throws IOException {
return IOUtils.toString(request.getReader());
}

2.1.3 二者区别

参考:http://stackoverflow.com/questions/10494574/what-is-the-difference-between-form-data-and-request-payload

结论:

  • Form data的Content-Type是 application/x-www-form-urlencoded (默认)
  • Request payload的Content-Type是 application/json;charset=UTF-8,或 不指定Content-Type
if a request (typically POST) has Content-type header set to application/x-www-form-urlencoded the body is expected to be in the form of a standard querystring with url-encoded key=value pairs joined by &.
Form data section then shows the key-value parameters (when viewed parsed).
This way was much more common in past because it is a default for HTML forms. other cases are shown in Request payload section (and nowadays parsed for readability as well for common formats like JSON).

如果一个请求(通常是POST)的Content-type头被设置为application/x-www-form-urlencoded,那么请求体应该是一个标准的查询字符串,带有url编码的key=value对,由&连接。

然后,表单数据部分显示键-值参数(当被查看时)。

这种方式在过去很常见,因为它是HTML表单的默认格式。

其他情况:

  • 如使用原生AJAX的POST请求,如果不指定请求头Request Header,默认使用的Content-Type是text/plain;charset=UTF-8,参数出现在Request payload块。
  • (现在为了可读性,也为常见格式如,JSON解析,其对应的Content-Typeapplication/json; charset=UTF-8)

3 解决方法

import requests;
session = requests.session();
response = session.request(method="POST", url="https://www.cnblogs.com/johnnyzen/ajax/GetPostStat", json = [ "11626301" ], headers={"content-type":"application/json; charset=UTF-8"});
print(response.status_code)
print("result:" + str(response.content))

X 参考文献

[Python]【Form Data vs Request Payload】之 python 爬虫如何实现 POST request payload 形式的请求的更多相关文章

  1. 1.2 Why Python for Data Analysis(为什么使用Python做数据分析)

    1.2 Why Python for Data Analysis?(为什么使用Python做数据分析) 这节我就不进行过多介绍了,Python近几年的发展势头是有目共睹的,尤其是在科学计算,数据处理, ...

  2. HTTP请求中的Form Data与Request Payload的区别

    前端开发中经常会用到AJAX发送异步请求,对于POST类型的请求会附带请求数据.而常用的两种传参方式为:Form Data 和 Request Payload. GET请求 使用get请求时,参数会以 ...

  3. Form Data 和 Request Payload 区别

    Form Data 和 Request Payload 区别 如果请求头里设置Content-Type: application/x-www-form-urlencoded,那么这个请求被认为是表单请 ...

  4. HTTP 请求中的 Form Data 与 Request Payload 的区别

    HTTP 请求中的 Form Data 与 Request Payload 的区别 前端开发中经常会用到 AJAX 发送异步请求,对于 POST 类型的请求会附带请求数据.而常用的两种传参方式为:Fo ...

  5. VUE axios 发送 Form Data 格式数据请求

    axios 默认是 Payload 格式数据请求,但有时候后端接收参数要求必须是 Form Data 格式的,所以我们就得进行转换.Payload 和 Form Data 的主要设置是根据请求头的 C ...

  6. asp.net query string 及 form data 遇到的编码问题

    当遇到此问题时,脑海里闪过的第一个解决方案是设置 web.config 的编码.但一想,就某一个页面的需求而导致其他跟着妥协,不是好的解决方案.于是网上搜索答案,下面做个小分享,遗憾的是研究不够深入, ...

  7. python爬虫如何POST request payload形式的请求

    python爬虫如何POST request payload形式的请求1. 背景最近在爬取某个站点时,发现在POST数据时,使用的数据格式是request payload,有别于之前常见的 POST数 ...

  8. form data和request payload的区别

    HTML <form> 标签的 enctype 属性 在下面的例子中,表单数据会在未编码的情况下进行发送: <form action="form_action.asp&qu ...

  9. HTTP请求中的form data和request payload的区别

    HTML <form> 标签的 enctype 属性 在下面的例子中,表单数据会在未编码的情况下进行发送: <form action="form_action.asp&qu ...

  10. [整理]Ajax Post请求下的Form Data和Request Payload

    Ajax Post请求下的Form Data和Request Payload 通常情况下,我们通过Post提交表单,以键值对的形式存储在请求体中.此时的reqeuest headers会有Conten ...

随机推荐

  1. Mac设置自动连接蓝牙设备

    1.安装blueutil管理软件 通过 brew install blueutil 2.通过命令: blueutil --paired 查看当前连接过的蓝牙设备的地址. 3.获取blueutil软件的 ...

  2. linux下opencv contrib安装

    opencv安装 1.1 安装依赖 sudo apt-get update sudo apt-get install build-essential sudo apt-get install cmak ...

  3. 4、jmeter的断言技术

    断言:从反馈的结果来个需求匹配,是不是想要的内容 注:断言必要的时候才用  用过了会影响速度 1.操作步骤: 去选择自己想要响应的文本或者代码或者信息等等..... 2.断言相应大小的字节 3.断言响 ...

  4. mongoBD增删改查

    查询方法一: db.ResDevices.find({"RegInfo.DeviceID": "d064b09ed28b2e988e4dc83adfb4c1"} ...

  5. Scala操作Kakfa API

    如需大数据开发整套视频(hadoop\hive\hbase\flume\sqoop\kafka\zookeeper\presto\spark):请联系QQ:1974983704 由于我使用的是kafk ...

  6. CSS选择艺术以及CSS文本样式

    CSS选择的艺术1.css规则由两部分构成:选择器,声明(声明由属性和值构成且末尾跟一个分号)2.css注释:/*--*/3.CSS样式的引用(1)行内样式(内联样式)例如:<p style=& ...

  7. python读取i3dm数据

    path = r'D:\data\1.i3dm'f = open(path, 'rb')f.seek(4)print('version:%d' % struct.unpack('I', f.read( ...

  8. python-实现栈结构

    # encoding=utf-8 class Stack(object): """栈""" def __init__(self): &quo ...

  9. Django Models字段设置为空,界面上还校验必填问题

    models.CharField(max_length=1000,null=True,blank=True) 其中blank=True是admin管理后台自动校验放开

  10. IDEA 文件夹下无法新建java class文件问题处理:

    主要问题 1 未设置为源文件夹. 2 包名中包含关键字,也无法创建. 解决方式 1 文件夹右键---Mark Directory as----Test Sources Root 即可. 2 重命名