Python error: Type error: POST data should be bytes; also user-agent issue

前端 未结 2 649
余生分开走
余生分开走 2020-12-18 23:25

Using the following code I received an error:

TypeError: POST data should be bytes or an iterable of bytes. It cannot be str

Second concern

相关标签:
2条回答
  • 2020-12-18 23:57

    You can try with requests module as an alternative solution

    import json
    import requests
    
    url = 'http://getliberty.org/contact-us/'
    user_agent = 'Mozilla/5.0 (compatible; Chrome/22.0.1229.94; Windows NT)'
    values = {
          'Your Name' : 'Horatio',
          'Your Email' : '6765Minus4181@gmail.com',
          'Subject' : 'Hello',
          'Your Message' : 'Cheers'
           }
    
    headers = {'User-Agent': user_agent, 'Content-Type':'application/json' }
    
    data = json.dumps(values)
    request = requests.post(url, data=data, headers=headers)
    
    response = request.json()
    
    0 讨论(0)
  • 2020-12-19 00:17
    data = urllib.parse.urlencode(values)
    type(data) #this returns <class 'str'>. it's a string
    

    The urllib docs say for urllib.request.Request(url, data ...):

    The urllib.parse.urlencode() function takes a mapping or sequence of 2-tuples and returns a string in this format. It should be encoded to bytes before being used as the data parameter. etc etc

    (emphasis mine)

    So you have a string that looks right, what you need is that string encoded into bytes. And you choose the encoding.

    binary_data = data.encode(encoding)
    

    in the above line: encoding can be 'utf-8' or 'ascii' or a bunch of other things. Pick whichever one the server expects.

    So you end up with something that looks like:

    data = urllib.parse.urlencode(values)
    binary_data = data.encode(encoding) 
    req = urllib.request.Request(url, binary_data)
    
    0 讨论(0)
提交回复
热议问题