711 发送请求失败_30秒上手新一代 Http 请求神器 RxHttp

本文出自「掘金社区」,欢迎戳「阅读原文」链接和作者进行技术交流 🎉🎉

开胃菜

话不多说,30s 倒计时开始,先来看看如何发送一个 Get 请求,如下:

RxHttp.get("http://...") //第一步,确定请求类型,这里为Get请求

.asString() //第二步,确定返回类型,这里返回String类型

.subscribe(s -> { //第二步,订阅观察者,第二步返回Observable对象

//请求成功

}, throwable -> {

//请求失败

});

Ok,倒计时结束!!! 到这,你已经学会了 RxHttp 的精髓。

是的,不用怀疑,就是这么简单,使用 RxHttp,任意请求,任意返回数据类型,都遵循这三个步骤,我们称之为请求三部曲。

重要事情说 3 遍

任意请求,任意返回数据类型,皆遵循请求三部曲

任意请求,任意返回数据类型,皆遵循请求三部曲

任意请求,任意返回数据类型,皆遵循请求三部曲

gradle 依赖

implementation 'com.rxjava.rxhttp:rxhttp:1.0.8'

//注解处理器,生成RxHttp类,即可一条链发送请求

annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.0.8'

注:RxHttp 类是通过注解处理器自动生成的,故需要您在项目中使用一处注解,然后 rebuild 一下项目,RxHttp 即可以生成。注解使用,请查看 RxHttp 一条链发送请求之注解处理器 Generated API(四)

三部曲解说

到这里相信很多人已经有疑问了

  • 如果我想发送 Post 等其它方式请求呢?

  • 文件上传下载及进度的监听呢?

  • 我想得到自定义的数据类型呢?

这些如何通过三部曲实现呢?别着急,接下来一一为大家讲解

第一步,确定请求方式

上面例子中,我们调用了 RxHttp.get("http://...")语句,其中 get操作符就代码 Get 请求。由此,我们可以猜测,发送 Post 请求,只需要调用 post操作符即可。然而我们只猜对了一半,为啥这么说呢?Post请求中,我们常见的又分为两种,一种的表单形式的 Post,另一种是 Json 字符串形式的 Post。为此,RxHttp 提供了两个发送 Post 请求的操作符,分别是 postFormpostJosn,此时,我们就可以这样发送 Post 请求

RxHttp.postForm("http://...") //发送表单形式的Post请求

.asString() //返回String类型

.subscribe(s -> { //订阅观察者,

//请求成功

}, throwable -> {

//请求失败

});

RxHttp.postJson("http://...") //发送Json字符串单形式的Post请求

.asString() //返回String类型

.subscribe(s -> { //订阅观察者,

//请求成功

}, throwable -> {

//请求失败

});

如果想发送 Delete、Put 等其它方式的请求,同理,如下:

RxHttp.deleteForm("http://...")

RxHttp.deleteJson("http://...")

RxHttp.putForm("http://...")

RxHttp.putJson("http://...")

//其它请求方式同上

最后,我们来看下,RxHttp 都提供了哪些请求方式,如下:f17019eab7309c80f0def33780bf5312.png其中 getpostFormpostJson上面已经讲过了,其它的同理,这里就不再讲述了。

请求方式确定了,如何添加参数或者头像信息呢?so easy!!!,只需调用 addaddHeader即可,如下:

RxHttp.postForm("http://...") //发送表单形式的Post请求

.add("key","value") //添加请求参数,该方法可调用多次

.addHeader("headerKey","headerValue") //添加请求头参数,该方法可调用多次

.asString() //返回String类型

.subscribe(s -> { //订阅观察者,

//请求成功

}, throwable -> {

//请求失败

});

第二步,确定返回数据类型

上面的 asString操作符代表返回String字符串类型,RxHttp 提供了 17asXXX操作符,如下:

cdb0570c60a20bb10f4c3f19c1aef6b4.png其中,asBoolean、asInteger、asLong、asString 等,我想很好理解,就是返回基本类型的装箱类型,这个不就过多讲解。这里我们重点看下 asObjectasListasDownload这 3 个操作符。

asObject

显示开发中,我们返回的更多是自定义的数据类型,比如我们想得到一个 Student 对象,此时,我们就可以用 asObject操作符,如下:

RxHttp.get("http://...") //发送Get请求

.asObject(Student.class) //指定返回User类型数据

.subscribe(student -> { //订阅观察者,

//请求成功,这里student就是Student对象

}, throwable -> {

//请求失败

});

asList

然而,如果我们想得到一系列 Student 对象呢?使用 asObject 显然行不通,此时就要用到 asList操作符了,如下:

RxHttp.get("http://...") //发送Get请求

.asList(Student.class) //指定返回User类型数据

.subscribe(students -> { //订阅观察者,

//请求成功,这里students就是List对象

}, throwable -> {

//请求失败

});

注:asXXX操作符,内部会默认指定请求在 Schedulers.io()线程执行

asDownload当我们需要下载文件,就用此操作符,如下:

RxHttp.get("http://...") //Get请求

.asDownload(".../rxhttp.apk") //使用asDownload操作符,并传入存储路径

.subscribe(s -> {

//下载成功回调,s为文件存储路径

}, (OnError) throwable -> {

//下载失败回调

});

更多文件操作,请查看 Android 史上最优雅的实现文件上传、下载及进度的监听

第三步,订阅观察者

在上一步中,细心的你也许发现了,使用了 asXXX操作符后,会返回一个 Observable对象,那这个又是什么对象呢?其实它就是 RxJava 内部的 Observable对象。

在这,可以告诉你,当我们调用 asXXX操作符,拿到 Observable对象后,RxHttp 就已经完成了它的使命,接下来的事情都丢给了 RxJava。拿到 Observable对象,结合 RxJava 强大的操作符,我们可以做非常多的事情,比如我们想要在主线程回调观察者,如下:

RxHttp.get("http://...") //发送Get请求

.asList(Student.class) //指定返回User类型数据

.observeOn(AndroidSchedulers.mainThread()) //主线程回调观察者

.subscribe(students -> { //订阅观察者,

//请求成功,这里students就是List对象

}, throwable -> {

//请求失败

});

注:请求默认在 Schedulers.io() 线程执行,如未指定观察者所在线程,则默认在请求所在线程回调

小结

好了,请求三部曲就讲解结束,到这,你已经掌握了 RxHttp 70% 的功能,并且掌握了 RxHttp 的精髓----请求三部曲,在任意请求中,就能做到以不变应万变。 本篇文章的目的在于提供一个简单的入门教程,更多功能请查看

  • RxHttp 一条链发送请求,新一代Http请求神器(一)

  • RxHttp 一条链发送请求之强大的数据解析功能(二)

  • RxHttp 一条链发送请求之强大的Param类(三)

  • RxHttp 一条链发送请求之注解处理器 Generated API(四)

  • Android 史上最优雅的实现文件上传、下载及进度的监听

问题简答

最后,借此机会,简单解答一下读者反馈的问题

1、RxHttp 支持 Https 吗?

答:支持,RxHttp 内置默认的 OkHttpClient 对象,如下:

new OkHttpClient.Builder()

.connectTimeout(10, TimeUnit.SECONDS)

.readTimeout(10, TimeUnit.SECONDS)

.writeTimeout(10, TimeUnit.SECONDS)

.sslSocketFactory(sslSocketFactory, trustAllCert) //添加信任证书

.hostnameVerifier((hostname, session) -> true) //忽略host验证

.build();

2、RxHttp 支持缓存处理吗?

答:支持,但是 RxHttp 默认没有做任何缓存处理,如有需要,请自定义OkHttpClient 对象开启缓存,并使用 RxHttp 发送请求时,使用 cacheControl(CacheControlcacheControl)设置缓存策略

3、RxHttp 如何支持 session 或者 token?

答:session 或者 token 设计到具体的业务逻辑,故 RxHttp 暂时并没有做深度封装。如有需要,可自定义 OkHttpClient 对象通过拦截器去实现。

4、RxHttp支持kotlin吗?

答:必须支持,但是依赖注解处理器时,需要使用 kapt 代替annotationProcessor

5、RxHttp 如何支持多任务列表下载

答:在最新的 Demo 中,已有案例,欢迎下载 Demo 体验

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。首先,你需要先在钉钉开发者平台上创建一个自定义机器人,并获取到机器人的webhook地址。然后,使用Python编写代码,调用钉钉机器人API发送图片。 以下是一个示例代码,可以帮助你实现钉钉机器人发送图片的功能: ```python import requests def send_dingtalk_image(image_url, access_token): """ 发送钉钉机器人图片消息 :param image_url: 图片的URL地址 :param access_token: 钉钉机器人的access_token """ url = "https://oapi.dingtalk.com/robot/send?access_token=" + access_token headers = {"Content-Type": "application/json;charset=utf-8"} data = { "msgtype": "image", "image": { "media_id": image_url } } response = requests.post(url=url, json=data, headers=headers) if response.status_code == 200: print("发送成功") else: print("发送失败") if __name__ == '__main__': # 图片的URL地址 image_url = "http://example.com/image.png" # 钉钉机器人的access_token access_token = "xxxxxxxxxxxxxx" # 调用发送钉钉机器人图片消息的函数 send_dingtalk_image(image_url, access_token) ``` 在调用`send_dingtalk_image`函数时,你需要传入图片的URL地址和钉钉机器人的access_token。其中,`image_url`参数为图片的URL地址,`access_token`参数为钉钉机器人的access_token。 注意,在发送图片消息时,需要将`msgtype`参数设置为`image`,并且在`image`字段中,将`media_id`设置为图片的URL地址。 希望这个示例代码可以帮助你实现钉钉机器人发送图片的功能。如果你还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值