python: HTTP PUT with unencoded binary data

后端 未结 4 2555
难免孤独
难免孤独 2021-02-20 07:09

I cannot for the life of me figure out how to perform an HTTP PUT request with verbatim binary data in Python 2.7 with the standard Python libraries.

I thought I could d

4条回答
  •  耶瑟儿~
    2021-02-20 07:17

    I found out my problem. It seems there is some obscure behavior in urllib2.Request / urllib2.urlopen() (at least in Python 2.7)

    The urllib2.Request(url, data, headers) constructor seems to expect the same type of string in its url and data parameters.

    I was giving the data parameter raw data from a file read() call (which in Python 2.7 returns it in the form of a 'plain' string), but my url was accidentally Unicode because I concatenated a portion of the URL from the result of another function which returned Unicode strings.

    Rather than trying to "downcast" url from Unicode -> plain strings, it tried to "upcast" the data parameter to Unicode, and it gave me a codec error. (oddly enough, this happens on the urllib2.urlopen() function call, not the urllib2.Request constructor)

    When I changed my function call to

    # headers contains `{'Content-Type': 'application/octet-stream'}`
    r = urllib2.Request(url.encode('utf-8'), data, headers)
    

    it worked fine.

提交回复
热议问题