Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RxHttp v3.0.0 版本讨论区 #409

Closed
liujingxing opened this issue Sep 26, 2022 · 52 comments
Closed

RxHttp v3.0.0 版本讨论区 #409

liujingxing opened this issue Sep 26, 2022 · 52 comments

Comments

@liujingxing
Copy link
Owner

liujingxing commented Sep 26, 2022

RxHttp 3.0版本一个重要的理念就是规范api的命名及使用,主要的改变有3点

1、asXxx/toXxx/toFlowXxx方法,均支持返回响应头及实体类,如下:

RxHttp.get("/server/...")
    .asClass<OkResponse<User>>()
    //.toClass<OkResponse<User>>()
    //.toFlow<OkResponse<User>>()

2、RxJava环境,新增onProgress/onMainProgress方法,该方法可监听上传/下载进度,如下:

//老方式监听下载进度
RxHttp.get("/server/...")
    .asDownload("本地下载路径", AndroidSchedulers.mainThread()) {
        //下载进度回调
    }
    ...

//老方式监听上传进度
RxHttp.postForm("/server/...")
    .addFile("file", File("本地文件路径"))
    .upload(AndroidSchedulers.mainThread()) {
        //上传进度回调
    }
    .asClass<T>()
    ...

//新方式监听下载进度
RxHttp.get("/server/...")
    .toObservableDownload("本地下载路径")
    .onMainProgress {
        //下载进度回调
    }
    ...

//新方式监听上传进度
RxHttp.postForm("/server/...")
    .addFile("file", File("本地文件路径"))
    .toObservable<T>()
    .onMainProgress {
        //上传进度回调
    }
    ...

3、计划将asXxx/toXxx/toFlowXxx方法改为toObservableXxx/toAwaitXxx/toFlowXxx

为啥要这么做?为了统一RxJava/Await/Flow三者的使用习惯,使得方法见名思义,如:

val observable: Observable<User>  = toObservable<User>()
val await: Await<User> = toAwait<User>()
val flow: Flow<User> = toFlow<User>()

详细的toObservable/toAwait/toFlow方法点击这里

但是,这样会有一个小小的问题,下载的时候,第一眼看去就不知是下载方法,如:

RxHttp.get("/server/...")
    .toObservable("本地绝对路径")
    ...

RxHttp.get("/server/...")
    .toAwait("本地绝对路径")
    ...

RxHttp.get("/server/...")
    .toFlow("本地绝对路径")
    ...

没有之前的asDownload/toDownload方法看起来舒服;有想过下载时额外处理,用toDownloadObservable/toDownloadAwait/toDownloadFlow方法替代,但方法名太长,还是有点难受,所以还在考虑中

对于RxHttp 3.0版本,大家有好的想法,欢迎留言,计划在国庆后正式发版。

@liujingxing
Copy link
Owner Author

liujingxing commented Sep 27, 2022

RxJava/Await/Flow下载方法命名方案投票:

  1. toObservable/toAwait/toFlow

  2. toDownObservable/toDownAwait/toDownFlow

  3. toDownloadObservable/toDownloadAwait/toDownloadFlow

目前对应的下载方法是asDownload/toDownload/toFlow

选择对应的序号留言即可,你也可以有第4个方案,欢迎留言,正式发版前,会选择github上投票最多的方案

@zwonb
Copy link

zwonb commented Sep 27, 2022

宁可长而清晰,也不短也而晦涩

@Kotlin2022
Copy link

见名知其意,方便新手开发,利于推广我选3

@JasonYinH
Copy link

3

2 similar comments
@jiqianwen
Copy link

3

@YJWWZHANG
Copy link

3

@HuangEnDi
Copy link

目前来看是3,但是有没有把下载单独做成一个设置然后使用1 类似于:
Rxhttp.get()
.isDownload()
.toAwaitXXX()

@Xxj-star
Copy link

asDownload/toDownload/toFlow 支持这种

@liujingxing
Copy link
Owner Author

liujingxing commented Sep 27, 2022

asDownload/toDownload/toFlow 支持这种

这种就api没有统一,toFlow看起来怪怪的

@Xxj-star
Copy link

2. toDownObservable/toDownAwait/toDownFlow

toDownObservable/toDownAwait/toDownFlow第2种可以

@liujingxing
Copy link
Owner Author

目前来看是3,但是有没有把下载单独做成一个设置然后使用1 类似于: Rxhttp.get() .isDownload() .toAwaitXXX()

我想想看

@haoshiwei
Copy link

一寸长一寸强,我选第三个,太短容易混淆

@zenghuiwang
Copy link

3

1 similar comment
@LDLGH
Copy link

LDLGH commented Sep 27, 2022

3

@manbuxingkong
Copy link

见名知意,我选第三个

@naixiu007
Copy link

显而易见,3看起来更舒服

@AlanPaine
Copy link

2为首选,建议1-2同时存在

@willBars
Copy link

遇事不决,选c(3)

@nopspace
Copy link

3

@shenxinke
Copy link

三短一长选最长,我选3

@loper7
Copy link

loper7 commented Sep 27, 2022

目前来看是3,但是有没有把下载单独做成一个设置然后使用1 类似于: Rxhttp.get() .isDownload() .toAwaitXXX()

这种看来是最好的,用 isdownload 标识当前为下载模式

@YJWWZHANG
Copy link

目前来看是3,但是有没有把下载单独做成一个设置然后使用1 类似于: Rxhttp.get() .isDownload() .toAwaitXXX()

这种看来是最好的,用 isdownload 标识当前为下载模式

赞同

@liujingxing
Copy link
Owner Author

目前来看是3,但是有没有把下载单独做成一个设置然后使用1 类似于: Rxhttp.get() .isDownload() .toAwaitXXX()

这种看来是最好的,用 isdownload 标识当前为下载模式

赞同

初步看了下,这种会打破请求三部曲的规则

@HuangEnDi
Copy link

目前来看是3,但是有没有把下载单独做成一个设置然后使用1 类似于: Rxhttp.get() .isDownload() .toAwaitXXX()

这种看来是最好的,用 isdownload 标识当前为下载模式

赞同

初步看了下,这种会打破请求三部曲的规则

这个三部曲是指最初设计时定义的规则吗,在我理解这个isDownload和add应该是算在同一步里的

@loper7
Copy link

loper7 commented Sep 27, 2022

目前来看是3,但是有没有把下载单独做成一个设置然后使用1 类似于: Rxhttp.get() .isDownload() .toAwaitXXX()

这种看来是最好的,用 isdownload 标识当前为下载模式

赞同

初步看了下,这种会打破请求三部曲的规则

或者这样?

RxHttp.getDownload("/server/...")//postDownload
    .toObservable("本地绝对路径")
    ...

也不适合,还有download(Context, Uri)等兼容Android 10的下载方法,这样就多出一堆方法

@liujingxing
Copy link
Owner Author

这个三部曲是指最初设计时定义的规则吗,在我理解这个isDownload和add应该是算在同一步里的

目前第一步都是返回RxHttp对象自身,isDownload返回自身的话就不适合,得返回一个新的对象,就多了一步。

@liujingxing liujingxing added the good first issue Good for newcomers label Sep 27, 2022
@liujingxing liujingxing pinned this issue Sep 27, 2022
@liujingxing liujingxing removed the good first issue Good for newcomers label Sep 27, 2022
@NeVaDaAAA
Copy link

3 清晰明了

@Jasperben
Copy link

期待加入WebSocket支持

@liujingxing
Copy link
Owner Author

期待加入WebSocket支持

okhttp自身就支持,okhttp怎么用,在rxhttp就怎么用,这块没有额外封装

@liujingxing
Copy link
Owner Author

@xiaoyvyv
Copy link

xiaoyvyv commented Mar 1, 2023

2.xx 的 toHeaders 没有兼容的 toAwaitHeaders

@liujingxing
Copy link
Owner Author

//3.0获取Headers/OkHttp3.Response
RxHttp.get("/server/...")
    .toObservable<OkResponse<User>>()  //Await/Flow 调用 toAwait/toFlow 
    .subscribe({                
        val headers = it.headers()    //Headers
        val response = it.raw()       //OkHttp3.Response
        val user = it.body()
    }, {                
        //异常回调                   
    })

@qyzhaojinxi
Copy link

我用的3.0.3,好像又改了,上边的不管用了

@liujingxing
Copy link
Owner Author

我用的3.0.3,好像又改了,上边的不管用了

没改,注意看3.0更新指南

@qyzhaojinxi
Copy link

WX20230531-105215@2x

这里不知道咋写,如果直接写.toObservable(OkResponse,class)会报gson解析报错,按照文档这种代码里就有红线报错

@liujingxing
Copy link
Owner Author

liujingxing commented May 31, 2023

这是kotlin的写法,再仔细看看文档 RxJava、Await、Flow 对应的 toObservaleXxx、toAwaitXxx、toFlowXxx方法介绍

@qyzhaojinxi
Copy link

哈哈,谢谢,找到了,java部分表格被遮住了,原来可以滑出来,之前没找到

@liujingxing liujingxing unpinned this issue Jun 29, 2023
@liujingxing liujingxing pinned this issue Jun 29, 2023
@liujingxing liujingxing unpinned this issue Jun 29, 2023
@liujingxing liujingxing pinned this issue Jun 29, 2023
@liujingxing liujingxing unpinned this issue Jun 29, 2023
@liujingxing
Copy link
Owner Author

#448

@itpers
Copy link

itpers commented Nov 29, 2023

val partData: ByteArray = xxxx
RxHttp.putBody("xxxx")
    .setBody(partData.toRequestBody())
    .toFlow<String>()
    .onProgress {
    }

文件分块上传,只有在partData上传完成才会收到 onProgress 的回调

@liujingxing
Copy link
Owner Author

val partData: ByteArray = xxxx
RxHttp.putBody("xxxx")
    .setBody(partData.toRequestBody())
    .toFlow<String>()
    .onProgress {
    }

文件分块上传,只有在partData上传完成才会收到 onProgress 的回调

RxHttp版本多少

@itpers
Copy link

itpers commented Nov 29, 2023

val partData: ByteArray = xxxx
RxHttp.putBody("xxxx")
    .setBody(partData.toRequestBody())
    .toFlow<String>()
    .onProgress {
    }

文件分块上传,只有在partData上传完成才会收到 onProgress 的回调

RxHttp版本多少

3.2.0, 升级到最新的3.2.2 也是同样的问题
image

@liujingxing
Copy link
Owner Author

return callback != null ? new ProgressRequestBody(requestBody, callback) : requestBody;

到这里去调试看看,理论上callback不为null,随后到ProgressRequestBody#sink(Sink)方法里的write方法去调试

@1226362423
Copy link

一直没有停留在2.0没有升级 to方法 改的太暴力 应该设置一下过时过度一下 我这几百个类 调用了 to方法

@liujingxing
Copy link
Owner Author

liujingxing commented Jun 28, 2024

一直没有停留在2.0没有升级 to方法 改的太暴力 应该设置一下过时过度一下 我这几百个类 调用了 to方法

看懂规则,全局搜索,一键替换即可
RxJava、Await、Flow 对应的 toObservaleXxx、toAwaitXxx、toFlowXxx方法介绍

@1226362423
Copy link

1226362423 commented Jun 29, 2024

image 集成3.2.7版本 kotlin 版本1.9.24 ksp 报错 老的2.8.0版本 kotlin 版本1.9.24 请求头参数传个字符串又乱码了 不知道怎么回事

我现在kotlin版本用到了今年5月最新版本 1.9.24就出现一些问题了

@liujingxing
Copy link
Owner Author

image 集成3.2.7版本 kotlin 版本1.9.24 ksp 报错 老的2.8.0版本 kotlin 版本1.9.24 请求头参数传个字符串又乱码了 不知道怎么回事 image

我现在kotlin版本用到了今年5月最新版本 1.9.24就出现一些问题了

提供下gradle版本、gradle插件版本、ksp版本

@1226362423
Copy link

1226362423 commented Jun 29, 2024

com.google.devtools.ksp 集成到 1.9.24-1.0.20 ksp这块没问题了 但是3.2.7的这个 toDownloadAwait 怎么用呀

onProgress 方法也没有
image
原来这种方法要怎么改
image

另外的那个问题2.8.0版本下确实请求头乱码了暂时不知道什么问题 kotlin版本1.9.24,gradle插件版本7.4.2 gradle版本7.5 出现的 所以我现在升级到3.2.7试下看还会不会出现请求头乱码的问题

image Authorization 和 上面的token传的是一样的字符串

另外在 2.8.0下 还有个问题 你那个request请求头contentType字段的那个charset:utf-8前面自动带了一个空格 有一些服务端是不能带有空格的 这里我在2.8.0版本加入了拦截器 处理了一下 这种request

@1226362423
Copy link

已成功升级到3.2.7 请求头没有乱码的问题了

@liujingxing
Copy link
Owner Author

liujingxing commented Jun 29, 2024

com.google.devtools.ksp 集成到 1.9.24-1.0.20 ksp这块没问题了 但是3.2.7的这个 toDownloadAwait 怎么用呀

onProgress 方法也没有 image 原来这种方法要怎么改 image

另外的那个问题2.8.0版本下确实请求头乱码了暂时不知道什么问题 kotlin版本1.9.24,gradle插件版本7.4.2 gradle版本7.5 出现的 所以我现在升级到3.2.7试下看还会不会出现请求头乱码的问题

image Authorization 和 上面的token传的是一样的字符串
另外在 2.8.0下 还有个问题 你那个request请求头contentType字段的那个charset:utf-8前面自动带了一个空格 有一些服务端是不能带有空格的 这里我在2.8.0版本加入了拦截器 处理了一下 这种request

1、在3.0版本前,Await方式实现上传/下载进度监听,内部是通过Flow实现的, 所以在3.0版本时,就移除了Await方式的上传/下载进度监听,建议直接通过Flow方式去实现,如下:

//下载进度监听
RxHttp.get("")
    .toDownloadFlow(String)
    .onProgress { }
    ...

//上传进度监听
RxHttp.postForm("")
    .addFile("file", File(""))
    .toFlow(String)
    .onProgress { }
    ...

2、关于contentType,charset:utf-8前自带空格问题,这是标准的协议,这个只能自己手动处理掉
3、Authorization不显示问题,应该是内容打印不出来,可以在添加Authorization的地方,自己打印日志试试看

@1226362423
Copy link

升级到3.2.7都已解决

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests