美文网首页
urllib和requests调用post时的注意事项:Cont

urllib和requests调用post时的注意事项:Cont

作者: AndrewMyh | 来源:发表于2021-03-14 22:55 被阅读0次

    Content-Type常见的有x-www-form-urlencoded;charset=UTF-8和application/json两种,格式不对的话可能出错!:

    x-www-form-urlencoded;charset=UTF-8

    这种类型最为常见,在使用urllib库发送post请求时,往往这么操作:

    from urllib import parse,request
    
    #其实默认就是这种格式,这一句也可以不加
    headers = {'Content-Type': 'x-www-form-urlencoded;charset=UTF-8'}
    #构造需要post的数据
    data={"name":"小明","password":"123456"}
    #编码成urlencode格式
    data = bytes(parse.urlencode(data),encoding='utf8')
    #构造request
    req =request.Request(url=url, headers=headers,data=data,method="POST")
    #发起请求
    response =request.urlopen(req)
    

    在执行完data = bytes(parse.urlencode(data).encode(‘utf-8’)后,data由原来的dict对象转成了bytes对象,而且内容变成了b'name=%E5%B0%8F%E6%98%8E&password=123456'有没有很熟悉?我们地址栏常见这种东西,其实它就是将原来dict对象中的键值对,转化成了类似get方法的链接形式,并将其中的数据进行编码。也即post过去的就是这个bytes对象

    对于requests:

    import requests
    
    #其实默认就是这种格式,这一句也可以不加
    headers = {'Content-Type': 'x-www-form-urlencoded;charset=UTF-8'}
    #需要post的数据
    data={"name":"小明","password":"123456"}
    #不需要编码,直接发请求
    response=requests.post(url,headers=headers,data=data)
    

    application/json

    这种相对不常见,但应该是今后的主流,因为毕竟json才是未来嘛。

    在使用urllib库发送post请求时,需要这么操作:

    from urllib import parse,request
    import json
    
    #修改格式
    headers = {'Content-Type': 'application/json'}
    #构造需要post的数据
    data={"name":"小明","password":"123456"}
    #编码成json格式
    data = bytes(json.dumps(data),encoding='utf8')
    #构造request
    req =request.Request(url=url, headers=headers,data=data,method="POST")
    #发起请求
    response =request.urlopen(req)
    

    同样,在执行完data = bytes(json.dumps(data),encoding='utf8')后,data由原来的dict对象转成了bytes对象,但内容和上面得不同,变成了b'{"name": "\\u5c0f\\u660e", "password": "123456"}',一眼就能看出,这就是json格式呀,只是中间的中文被编码了

    对于requests:

    import requests
    
    #修改格式
    headers = {'Content-Type': 'application/json'}
    #构造需要post的数据
    data={"name":"小明","password":"123456"}
    #转成json格式
    response=requests.post(url,headers=headers,data=json.dumps(data))
    

    案例:

    在调用6panAPI搭建自动提交离线任务的项目时,API要求的请求数据是json格式的,但我没有去修改请求头和数据,造成post请求过去之后,服务器以为我发了一个空请求,于是还给我一个{“success”:0},给我整蒙了,最后进了官方QQ群问了技术支持人员才知道

    相关文章

      网友评论

          本文标题:urllib和requests调用post时的注意事项:Cont

          本文链接:https://www.haomeiwen.com/subject/mixhcltx.html