我想在urllib.request
设置标题,以某种方式摆脱http.client.BadStatusLine
headers = ['Content-length']=str(len(bytes(body, 'utf-8')))
req = urllib.request.Request(url, bytes(body, 'utf-8'), headers)
来源:BadStatusLine exception raised when returning reply from server in Python 3
body
中hearders
引用的内容是什么?
答案 0 :(得分:0)
正确的语法是
headers['Content-length']=str(len(bytes(body, 'utf-8')))
例如,当您请求页面时:http://www.york.ac.uk/teaching/cws/wws/webpage1.html
(它是演示的简单页面,它没有额外的资源),服务器响应头如下所示。您可以在chrome或firefox的开发控制台中的任何页面上看到此信息,在“网络”选项卡和“所有”标题下。
Accept-Ranges:bytes
Cache-Control:max-age=300
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:1957
Content-Type:text/html
Date:Sun, 17 Jul 2016 06:48:41 GMT
Expires:Sun, 17 Jul 2016 06:53:41 GMT
Keep-Alive:timeout=4, max=100
Server:Apache/2.2.22 (Ubuntu)
Vary:Accept-Encoding
content-Length标头显示长度为1957字节。如果您转到页面并按Ctrl-U
检查来源。您将观察到文本的大小更多。但收到的文本是压缩的。所以转到http://www.txtwizard.net/compression,然后输入源文本。您将观察到压缩大小为1957字节(标头中的编码也称为Content-Encoding:Gzip
,并且该站点已配置为gz
压缩。
因此,对于代码,body
是服务器html或其他方式的响应(例如文件,图像或content-type
标题所表示的任何内容。)
另一个例子:https://github.com/python/cpython/blob/master/Lib/http/server.py#L752
这是SimpleHTTPResponseHandler的python3代码,可用于为内置的python服务器编写自定义处理程序。
变量encoded
是包含编码为要传递给do_GET函数的二进制文件的html响应的字符串。检查Content-Length
标头是否设置为编码字符串的大小。