Hello _ world

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

这个类是一个URL请求的抽象。

url应该是包含有效URL的字符串。

data必须是指定要发送给服务器的附加数据的对象,如果不需要此类数据,则为None。目前HTTP请求是唯一使用data的请求。支持的对象类型包括字节,文件类对象和迭代器。如果没有提供Content-Length和Transfer-Encoding头字段,HTTPHandler将根据数据类型设置这些头字段。Content-Length将用于发送字节对象,而Transfer-Encoding:按照RFC 7230中第3.3.1节的规定分块,将用于发送文件和其他可迭代数据。

对于HTTP POST请求方法,data应该是标准的application/x-www-form-urlencoded格式的缓冲区。urllib.parse.urlencode()函数采用2元组的映射(mapping)或序列(sequence),并以此格式返回ASCII字符串。 在用作数据参数之前,它应该被编码为字节。

headers应该是一个字典,并且将被视为调用了键和值都作为参数的add_header()函数。这通常用于“欺骗”User-Agent标头值,浏览器使用它来标识它自己 - 一些HTTP服务器只允许来自普通浏览器而不是脚本的请求。例如,Mozilla Firefox可能会将自己标识为“Mozilla / 5.0(X11; U; Linux i686)Gecko / 20071127 Firefox / 2.0.0.11”,而urllib的默认用户代理字符串是“Python-urllib / 2.6”。

如果data参数存在,应该包含适当的Content-Type标头。 如果未提供此标头且data不是None,则将添加Content-Type:application / x-www-form-urlencoded作为默认值。

最后两个参数只对正确处理第三方HTTP cookies感兴趣:

origin_req_host应该是RFC 2965定义的源事务的请求主机。它默认为http.cookiejar.request_host(self)。 这是用户发起的原始请求的主机名或IP地址。 例如,如果请求是针对HTML文档中的图像的,则该请求应该是包含图像的页面请求的请求主机。

unverifiable应表明请求是否无法验证,如RFC 2965所定义。它默认为False。一个无法验证的请求是其用户没有选择批准的URL。 例如,如果请求是针对HTML文档中的图像,并且用户无权批准自动获取图像,则应该是正确的。

method应该是一个字符串,表示将要使用的HTTP请求方法(例如'HEAD')。 如果提供,其值将存储在method属性中,并由get_method()使用。 如果data为None或'POST',则默认为'GET'。 通过在类中设置method属性,子类可以指示不同的默认方法。

注意:如果data对象无法多次传送其内容(例如,文件或可迭代的内容只能生成一次内容),并且重新请求HTTP重定向或身份验证请求,则请求将无法按预期工作。 data在标头之后立即发送到HTTP服务器。 在库中不支持100-continue expectation。

扩展:

1、关于Content-Type中application/x-www-form-urlencoded 和 multipart/form-data的区别及用法

在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。 例如: application/x-www-form-urlencoded: 窗体数据被编码为键/值对。这是标准的编码格式。 multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分,这个一般文件上传时用。 text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。

form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。

1.x-www-form-urlencoded
当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。

 

2、urllib.parse.urlencode(querydoseq=Falsesafe=''encoding=Noneerrors=Nonequote_via=quote_plus)

将映射对象或可能包含str或bytes对象的两元素元组的序列转换为百分比编码的ASCII文本字符串。 如果生成的字符串要作为用于使用urlopen()函数进行POST操作的数据,则应将其编码为字节,否则将导致TypeError。

生成的字符串是一系列由'&'字符分隔的键=值对,其中键和值都被quote_via函数引用。 默认情况下,quote_plus()用于引用值,这意味着空格被引用为“+”字符,“/”字符编码为%2F,它遵循GET请求的标准(application / x-www-form-urlencoded)。 可以作为quote_via传递的另一个函数是quote(),它将空格编码为%20,而不编码'/'字符。 为了最大限度地控制引用内容,请使用引号并指定一个安全值。

当使用两元素元组作为query参数时,每个元组的第一个元素是一个键,第二个元素是一个值。 value元素本身可以是一个序列,在这种情况下,如果可选参数doseq的计算结果为True,则将为该键的值序列的每个元素生成由'&'分隔的单个键=值对。 编码字符串中参数的顺序将与序列中参数元组的顺序相匹配。

safeencodingerrors参数传递给quote_viaencodingerrors参数只在查询元素为str时传递)。

请参阅urllib examples以了解如何使用urlencode方法为URL生成查询字符串或为POST生成数据。

3、Request.add_header(keyval)

向请求添加其他标头。 除了HTTP处理程序之外,所有处理程序都会忽略标头,并将它们添加到发送到服务器的标头列表中。 请注意,不能有多个具有相同名称的标题,并且以后的调用将覆盖以前的调用,以防键发生冲突。 目前,这并不是HTTP功能的损失,因为所有在不止一次使用时具有含义的标头具有仅使用一个标题获得相同功能的(标头特定的)方式。

posted on 2018-03-08 21:44  Hello _ world  阅读(390)  评论(0编辑  收藏  举报