requsets之post

本文档介绍了HTTP请求中Content-Type的作用,特别是与JSON数据交互时的应用。当遇到JSON解析异常时,通过使用requests.post的json参数成功解决了问题,实现了正确调用API获取课程内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值