sign = 'd1462fde59f7674260b16630b0b1c791'
timestamp = '1602753947259'
token = 'ca24cce3e962f06134dd79d07c80b252'
def getallcoursecontent():
url = 'http://api.XXXX.com/sys/coursepackagecontent/getallcoursecontent'
headers = {
'sign': sign,
'timestamp': timestamp,
'token': token,
'Content-Type': 'application/json'
}
data = {
'levelStage': '5',
'pageIndex': '1',
'pageSize': '10'
}
r = requests.post(url=url, headers=headers, data=data).text
return print(r)
getallcoursecontent()
{"success":false,"code":"400","data":null,"message":"JSON解析异常","token":null,"encrypt":false,"timestamp":1602754020388}
我们加了content-type:application/json,但是返回结果却是JSON解析异常,我把数据拿去在线解析也没问题,但是为什么会这样呢?首先我们了解下content-type是什么
content-type:在Request Headers里表示请求和响应中的媒体类型信息,它用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析并展示html等等。
常见的Content-Type:
- HTML文档标记:text/html;
- 普通ASCII文档标记:text/html;
- JPEG图片标记:image/jpeg;
- GIF图片标记:image/gif;
- js文档标记:application/javascript;
- xml文件标记:application/xml;
上面的Content-Type,我们只认得就好,但是下面有4种是需要我们清楚他们的区别及牢记在心的。
content-type:application/x-www-form-urlencoded
如果不指定content-type,则默认格式content-type:application/x-www-form-urlencoded
HTTP会将请求参数用key1=val1&key2=val2的方式进行组织,并放到请求实体里面,注意如果是中文或特殊字符如"/"、","、“:" 等会自动进行URL转码。不支持文件,一般用于表单提交。
content-type:multipart/form-data
与application/x-www-form-urlencoded不同,这是一个多部分多媒体类型。首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以------boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个boundary块。如果参数是文件会有特别的文件域。最后以------boundary–为结束标识。multipart/form-data支持文件上传的格式,一般需要上传文件的表单则用该类型。
content-type:application/json
JSON 是一种轻量级的数据格式,以“键-值”对的方式组织的数据。这个使用这个类型,需要参数本身就是json格式的数据,参数会被直接放到请求实体里,不进行任何处理。服务端/客户端会按json格式解析数据(约定好的情况下)。
content-type:application/xml 和 content-type:text/xml
与application/json类似,这里用的是xml格式的数据,text/xml的话,将忽略xml数据里的编码格式。
下面我们来看下接口文档
文档告诉我们次接口参数为json格式,但是要注意,如果开发没有特殊说明,则data参数加上content-type:application/json就可以请求成功
但是如果请求失败并报json解析异常时,你就要用到requests.post中的另一个参数:json
接口api:
def post(url, data=None, json=None, **kwargs):
"""Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request('post', url, data=data, json=json, **kwargs)
api明确告诉我们要在类的主体中发送的json数据时,可以用json参数
下面是使用json参数
def getallcoursecontent():
url = 'http://api.XXXX.com/sys/coursepackagecontent/getallcoursecontent'
headers = {
'sign': sign,
'timestamp': timestamp,
'token': token
}
data = {
'levelStage': '5',
'pageIndex': '1',
'pageSize': '10'
}
r = requests.post(url=url, headers=headers, json=data).text
return print(r)
{"success":true,"code":"200","data":{"totalSize":20,"totalPage":2,"dataList":[{"classOutlineContent":"","classUrl":"","homeworkContent":"测试测试2","coverImageUrl":"","id":"1","sn":"1","courseLevelStage":"5"},{"classOutlineContent":"","classUrl":"","homeworkContent":"","coverImageUrl":"","id":"107","sn":"2","courseLevelStage":"5"},{"classOutlineContent":"","classUrl":"","homeworkContent":"","coverImageUrl":"","id":"108","sn":"3","courseLevelStage":"5"},{"classOutlineContent":"","classUrl":"","homeworkContent":"","coverImageUrl":"","id":"109","sn":"4","courseLevelStage":"5"},{"classOutlineContent":"","classUrl":"","homeworkContent":"","coverImageUrl":"","id":"110","sn":"5","courseLevelStage":"5"},{"classOutlineContent":"","classUrl":"","homeworkContent":"","coverImageUrl":"","id":"111","sn":"6","courseLevelStage":"5"},{"classOutlineContent":"","classUrl":"","homeworkContent":"","coverImageUrl":"","id":"112","sn":"7","courseLevelStage":"5"},{"classOutlineContent":"","classUrl":"","homeworkContent":"","coverImageUrl":"","id":"113","sn":"8","courseLevelStage":"5"},{"classOutlineContent":"","classUrl":"","homeworkContent":"","coverImageUrl":"","id":"114","sn":"9","courseLevelStage":"5"},{"classOutlineContent":"","classUrl":"","homeworkContent":"","coverImageUrl":"","id":"115","sn":"10","courseLevelStage":"5"}],"pageSize":10,"currentPage":1},"message":"请求成功","token":null,"encrypt":false,"timestamp":1602755473877}
总结:
最简单方法就是,使用post方法时data参数请求失败就使用json参数