首页 > 其他分享 >httpx教程

httpx教程

时间:2024-02-01 14:36:06浏览次数:25  
标签:... 教程 httpbin get https org httpx

首先,首先导入 HTTPX:

 

  1. >>>import httpx

 

现在,让我们尝试获取一个网页。

  1. >>> r = httpx.get('https://httpbin.org/get')
  2. >>> r
  3. <Response[200 OK]>

 

同样,发出HTTP POST请求:

  1. >>> r = httpx.post('https://httpbin.org/post', data={'key':'value'})

 

PUT,DELETE,HEAD和OPTIONS请求都遵循相同的样式:

  1. >>> r = httpx.put('https://httpbin.org/put', data={'key':'value'})
  2. >>> r = httpx.delete('https://httpbin.org/delete')
  3. >>> r = httpx.head('https://httpbin.org/get')
  4. >>> r = httpx.options('https://httpbin.org/get')

 

在URL中传递参数

要在请求中包括URL查询参数,请使用 params关键字:

  1. >>>params={'key1':'value1','key2':'value2'}
  2. >>> r = httpx.get('https://httpbin.org/get',params=params)

 

要查看这些值如何编码为URL字符串,我们可以检查用于发出请求的结果URL:

  1. >>> r.url
  2. URL('https://httpbin.org/get?key2=value2&key1=value1'))

 

您还可以将项目列表作为值传递:

  1. >>>params={'key1':'value1','key2':['value2','value3']}
  2. >>> r = httpx.get('https://httpbin.org/get',params=params)
  3. >>> r.url
  4. URL('https://httpbin.org/get?key1=value1&key2=value2&key2=value3')

 

响应内容

HTTPX将自动处理将响应内容解码为Unicode文本。

  1. >>> r = httpx.get('https://www.example.org/')
  2. >>> r.text
  3. '<!doctype html>\n<html>\n<head>\n<title>Example Domain</title>...'

 

您可以检查已使用哪种编码来解码响应。

  1. >>> r.encoding
  2. 'UTF-8'

 

如果您需要覆盖标准行为并明确设置要使用的编码,则也可以这样做。

  1. >>> r.encoding ='ISO-8859-1'

 

二进制响应内容

对于非文本响应,响应内容也可以字节形式访问:

  1. >>> r.content
  2. b'<!doctype html>\n<html>\n<head>\n<title>Example Domain</title>...'

 

任何 gzip和 deflateHTTP响应编码都会自动为您解码。如果 brotlipy已安装,则 brotli还将支持响应编码。

例如,要根据请求返回的二进制数据创建图像,可以使用以下代码:

  1. >>>from PIL importImage
  2. >>>from io importBytesIO
  3. >>> i =Image.open(BytesIO(r.content))

 

返回 JSON 响应内容

通常,Web API 响应将被编码为 JSON。

  1. >>> r = httpx.get('https://api.github.com/events')
  2. >>> r.json()
  3. [{u'repository':{u'open_issues':0, u'url':'https://github.com/...'...}}]

 

自定义 Headers

要在传出请求中包含其他标头,请使用 headers关键字参数:

  1. >>> url ='http://httpbin.org/headers'
  2. >>> headers ={'user-agent':'my-app/0.0.1'}
  3. >>> r = httpx.get(url, headers=headers)

 

发送表单数据

某些类型的HTTP请求(例如 POST和 PUT请求)可以在请求正文中包含数据。一种常见的添加方式是作为表单编码数据,用于HTML表单。

  1. >>> data ={'key1':'value1','key2':'value2'}
  2. >>> r = httpx.post("https://httpbin.org/post", data=data)
  3. >>>print(r.text)
  4. {
  5. ...
  6. "form":{
  7. "key2":"value2",
  8. "key1":"value1"
  9. },
  10. ...
  11. }

 

表单编码的数据还可以包括给定键的多个值。

  1. >>> data ={'key1':['value1','value2']}
  2. >>> r = httpx.post("https://httpbin.org/post", data=data)
  3. >>>print(r.text)
  4. {
  5. ...
  6. "form":{
  7. "key1":[
  8. "value1",
  9. "value2"
  10. ]
  11. },
  12. ...
  13. }

 

发送分段文件上传

您还可以使用HTTP分段编码上传文件:

  1. >>> files ={'upload-file': open('report.xls','rb')}
  2. >>> r = httpx.post("https://httpbin.org/post", files=files)
  3. >>>print(r.text)
  4. {
  5. ...
  6. "files":{
  7. "upload-file":"<... binary content ...>"
  8. },
  9. ...
  10. }

 

您还可以通过使用项目元组作为文件值来显式设置文件名和内容类型:

  1. >>> files ={'upload-file':('report.xls', open('report.xls','rb'),'application/vnd.ms-excel')}
  2. >>> r = httpx.post("https://httpbin.org/post", files=files)
  3. >>>print(r.text)
  4. {
  5. ...
  6. "files":{
  7. "upload-file":"<... binary content ...>"
  8. },
  9. ...
  10. }

 

发送 JSON 编码数据

如果您只需要一个简单的键值数据结构,就可以使用表单编码的数据。对于更复杂的数据结构,您通常需要改用JSON编码。

  1. >>> data ={'integer':123,'boolean':True,'list':['a','b','c']}
  2. >>> r = httpx.post("https://httpbin.org/post", json=data)
  3. >>>print(r.text)
  4. {
  5. ...
  6. "json":{
  7. "boolean":true,
  8. "integer":123,
  9. "list":[
  10. "a",
  11. "b",
  12. "c"
  13. ]
  14. },
  15. ...
  16. }

 

发送二进制请求数据

对于其他编码,应使用 bytesyield 的类型或生成器 bytes

Content-Type在上传二进制数据时,您可能还需要设置自定义标头。

响应状态码

我们可以检查响应的HTTP状态代码:

  1. >>> r = httpx.get('https://httpbin.org/get')
  2. >>> r.status_code
  3. 200

 

HTTPX还包括一个简单的快捷方式,用于通过其文本短语访问状态代码。

  1. >>> r.status_code == httpx.codes.OK
  2. True

 

我们可以针对任何客户端或服务器错误响应(4xx或5xx状态代码)引发异常:

  1. >>> not_found = httpx.get('https://httpbin.org/status/404')
  2. >>> not_found.status_code
  3. 404
  4. >>> not_found.raise_for_status()
  5. Traceback(most recent call last):
  6. File"/Users/tomchristie/GitHub/encode/httpcore/httpx/models.py", line 776,in raise_for_status
  7. raiseHttpError(message)
  8. httpx.exceptions.HttpError:404NotFound

 

任何成功的响应代码都将简单地返回 None而不是引发异常。

  1. >>> r.status_code == httpx.codes.OK
  2. True

 

响应 Headers

响应标头可作为类似于字典的接口使用。

  1. >>> r.headers
  2. Headers({
  3. 'content-encoding':'gzip',
  4. 'transfer-encoding':'chunked',
  5. 'connection':'close',
  6. 'server':'nginx/1.0.4',
  7. 'x-runtime':'148ms',
  8. 'etag':'"e1ca502697e5c9317743dc078f67693f"',
  9. 'content-type':'application/json'
  10. })

 

该 Headers数据类型是不区分大小写的,所以你可以使用任何资本。

  1. >>> r.headers['Content-Type']
  2. 'application/json'
  3. >>> r.headers.get('content-type')
  4. 'application/json'

 

根据RFC 7230,单个响应 headers 的多个值表示为单个逗号分隔的值:

接收者可以通过将每个随后的字段值按顺序附加到合并的字段值上,并用下列分隔符分隔,将多个具有相同字段名的头字段组合成一对“字段名:字段值”,而不会改变消息的语义。逗号。

流响应

对于大型下载,您可能需要使用不将整个响应主体立即加载到内存中的流式响应。

您可以流式传输响应的二进制内容...

  1. >>>with httpx.stream("GET","https://www.example.com")as r:
  2. ...for data in r.iter_bytes():
  3. ...print(data)

 

或回应文字...

  1. >>>with httpx.stream("GET","https://www.example.com")as r:
  2. ...for text in r.iter_text():
  3. ...print(text)

 

或逐行流文本...

  1. >>>with httpx.stream("GET","https://www.example.com")as r:
  2. ...for line in r.iter_lines():
  3. ...print(line)

 

HTTPX将使用通用行结尾,将所有情况标准化为 \n

在某些情况下,您可能希望在不应用任何HTTP内容解码的情况下访问响应上的原始字节。在这种情况下的任何内容编码web服务器已诸如施加 gzip, deflate或 brotli将不会自动解码。

  1. >>>with httpx.stream("GET","https://www.example.com")as r:
  2. ...for chunk in r.iter_raw():
  3. ...print(chunk)

 

如果您以上述任何一种方式使用流式响应,则 response.contentand response.text属性将不可用,并且如果访问将引发错误。但是,您还可以使用响应流功能来有条件地加载响应主体:

  1. >>>with httpx.stream("GET","https://www.example.com")as r:
  2. ...if r.headers['Content-Length']< TOO_LONG:
  3. ... r.read()
  4. ...print(r.text)

 

Cookies

可以轻松访问响应中设置的任何cookie:

  1. >>> r = httpx.get('http://httpbin.org/cookies/set?chocolate=chip', allow_redirects=False)
  2. >>> r.cookies['chocolate']
  3. 'chip'

 

要将Cookie包含在外发请求中,请使用 cookies参数:

  1. >>> cookies ={"peanut":"butter"}
  2. >>> r = httpx.get('http://httpbin.org/cookies', cookies=cookies)
  3. >>> r.json()
  4. {'cookies':{'peanut':'butter'}}

 

Cookie是在 Cookies实例中返回的,该实例是一种类似dict的数据结构,带有用于按其域或路径访问Cookie的其他API。

  1. >>> cookies = httpx.Cookies()
  2. >>> cookies.set('cookie_on_domain','hello, there!', domain='httpbin.org')
  3. >>> cookies.set('cookie_off_domain','nope.', domain='example.org')
  4. >>> r = httpx.get('http://httpbin.org/cookies', cookies=cookies)
  5. >>> r.json()
  6. {'cookies':{'cookie_on_domain':'hello, there!'}}

 

url 重定向 和 历史

默认情况下,HTTPX将对重定向执行除 HEAD请求之外的任何操作。

history响应的属性可用于检查所有后续重定向。它包含遵循它们的顺序的所有重定向响应的列表。

例如,GitHub将所有HTTP请求重定向到HTTPS。

  1. >>> r = httpx.get('http://github.com/')
  2. >>> r.url
  3. URL('https://github.com/')
  4. >>> r.status_code
  5. 200
  6. >>> r.history
  7. [<Response[301MovedPermanently]>]

 

您可以使用allow_redirects参数修改默认的重定向处理:

  1. >>> r = httpx.get('http://github.com/', allow_redirects=False)
  2. >>> r.status_code
  3. 301
  4. >>> r.history
  5. []

 

如果要发出 HEAD请求,则可以使用它来启用重定向:

  1. >>> r = httpx.head('http://github.com/', allow_redirects=True)
  2. >>> r.url
  3. 'https://github.com/'
  4. >>> r.history
  5. [<Response[301MovedPermanently]>]

 

超时时间

HTTPX默认为所有网络操作都包括合理的超时,这意味着,如果未正确建立连接,则它应始终引发错误而不是无限期地挂起。

网络不活动的默认超时为五秒。您可以将值修改为或多或少严格:

  1. >>> httpx.get('https://github.com/', timeout=0.001)

 

您还可以完全禁用超时行为...

  1. >>> httpx.get('https://github.com/', timeout=None)

 

有关高级超时管理,请参阅“ 超时微调”

认证方式

HTTPX支持基本和摘要HTTP身份验证。

要提供基本身份验证凭据,请将2个元组的纯文本 str或 bytes对象作为 auth参数传递给请求函数:

  1. >>> httpx.get("https://example.com", auth=("my_user","password123"))

 

要提供摘要式身份验证的凭据,您需要 DigestAuth使用纯文本用户名和密码作为参数实例化一个对象。然后可以将该对象作为 auth参数传递给上述请求方法:

  1. >>> auth = httpx.DigestAuth("my_user","password123")
  2. >>> httpx.get("https://example.com", auth=auth)
  3. <Response[200 OK]>

标签:...,教程,httpbin,get,https,org,httpx
From: https://www.cnblogs.com/full-stack-linux-new/p/18001144

相关文章

  • 无涯教程-constructor函数
    构造函数返回对创建原型的字符串函数的引用。constructor-语法string.constructorconstructor-返回值返回创建该对象的函数。varstr=newString("Thisisstring");console.log("str.constructoris:"+str.constructor)运行上面代码输出str.constructoris:fun......
  • Zabbix监控InfluxDB数据库教程
    简介InfluxDB是一个时序数据库,旨在处理时间戳数据的高写入和查询负载。它是用Go编程语言编写的开源数据库,专门用于存储和查询时间序列数据,如指标、事件和日志。InfluxDB通常用于监控和可观测性、物联网应用和实时分析。它支持类似SQL的查询语言,并与各种数据可视化和监控工具集成。......
  • 界面组件DevExpress中文教程 - 如何使用UI本地化客户端工具本地化应用
    DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboardeXpressApp框架、适用于VisualStudio的CodeRush等一系列辅助工具。获取DevExpressv23.2正式版下载DevExpress技术交流群9:909157416      欢迎一起进群讨论在2023年12月(......
  • tcp 远程服务器,C#编程学习之使用TcpClient / BeginConnect测试远程服务器tcp端口连接
    原文链接:hhttps://blog.csdn.net/weixin_36286567/article/details/119265325有时候经常需要对一些服务器的端口进行tcp连接测试,通常使用“telnetIP地址端口号”的方式即可,不能说这种方式不可取,只是使用起来比较麻烦,本着简单好用的目的,不如我们自己动手写一个测试tcp端口连接的......
  • 无涯教程-toExponential()函数
    此方法返回一个以指数表示形式表示数字对象的字符串。toExponential()-语法number.toExponential([fractionDigits])fractionDigits   - 一个整数,指定小数点后的位数。toExponential()-返回值一个字符串,以指数表示形式表示Number对象,其小数点前有一位数字,四舍......
  • 无涯教程-Number.parseFloat()函数
    此方法解析字符串参数,并返回传递的字符串的浮点表示形式。Number.parseFloat()-语法Number.parseFloat(string)string  - 要解析的值Number.parseFloat()-返回值字符串的浮点表示形式。Number.parseFloat()-示例console.log(Number.parseFloat("10"));conso......
  • Angular 17+ 高级教程 – Routing 路由 (功能篇)
    前言这篇只讲功能不讲原理。没有循序渐进,没有由浅入深,一个主题讲到底。 Route    目录上一篇 Angular17+高级教程–Routing路由(原理篇)下一篇TODO想查看目录,请移步 Angular17+高级教程–目录......
  • [office] excel中固定首行的教程
    Excel中首行具体该如何固定呢?接下来是小编为大家带来的excel中固定首行的教程,供大家参考。步骤1:在最上面菜单栏点击视图,然后找到“冻结窗格”,在下拉菜单中选择“冻结首行”。步骤2:接着,就可以滚动鼠标滚轮,查看效果了excel中固定首行的教程(二)步骤1:打开一个excel文件......
  • ComfyUI 安装教程 Animatediff 1000张工作流分享 请收藏
    最近SD的大更新比较少,所以最近转战到ComfyUI,从流程节点,到工作流搭建,使用ComfyUI实现webui的大部分功能,且节点的定义性很强,这就造就了ComfyUI的多样性,但是不得不承认,多节点之间的搭配,是否符合整个底层流程,通过一个工作流实现多节点插件的配合工作是比较复杂的,而ComfyUI不近支持GPU还......
  • 无涯教程-Number.isFinite()函数
    Number.isFinite()方法确定传递的值是否为有限数字。Number.isFinite()-语法varres=Number.isFinite(value);Number.isFinite()-返回值返回布尔值true或false。Number.isFinite()-示例varres=Number.isFinite(10);console.log(res);运行上面代码输出true参......