- 再也不做稀饭了
-
@FormUrlEncoded
@POST("Comments/{newsId}")
Call<Comment> reportComment(
@Path("newsId") String commentId,
@Field("reason") String reason);1234512345
需要补全URL,问号后加入access_token,post的数据只有一条reason
英语retrofit 和remodel的区别
retrofit 英[u02c8retru0259u028afu026at] 美[u02c8retrou028afu026at] n. 式样翻新,花样翻新; vt. 给机器设备装配(新部件),翻新,改型; [例句]Much of this business involves retrofitting existing planes这项业务主要是改造更新现有的飞机。[其他] 第三人称单数:retrofits 复数:retrofits 现在分词:retrofitting过去式:retrofitted 过去分词:retrofitted remodel 英[u02ccri:u02c8mu0252dl] 美[u02ccri:u02c8mɑ:dl] vt. 改变…的结构[形状]; [例句]Workmen were hired to remodel and enlarge the farm buildings雇用了工人来改造和扩建农场建筑。[其他] 第三人称单数:remodels 现在分词:remodelling 过去式:remodelled过去分词:remodelled2023-07-31 20:20:251
retrofit和 rpc 的区别
retrofit 英[u02c8retru0259u028afu026at]美[u02c8retrou028afu026at]n. 式样翻新,花样翻新;vt. 给机器设备装配(新部件),翻新,改型;[例句]Much of this business involves retrofitting existing planes这项业务主要是改造更新现有的飞机。[其他] 第三人称单数:retrofits 复数:retrofits 现在分词:retrofitting 过去式:retrofitted 过去分词:retrofittedRPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。2023-07-31 20:20:561
Android Retrofit详解
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装 1.添加Retrofit库的依赖: 后面三个是可选的,分别是数据解析器和gson,以及rxjava支持的依赖 2.创建 用于描述网络请求 的接口 Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数 3.创建Retrofit实例 4.发送请求 请求分为同步请求和异步请求 response.body()就是Reception对象,网络请求的完整 Url =在创建Retrofit实例时通过.baseUrl()设置 +网络请求接口的注解设置(下面称 “path“ ) 整合的规则如下: 上面我们用了@GET注解来发送Get请求,Retrofit还提供了很多其他的注解类型 1.@GET、@POST、@PUT、@DELETE、@HEAD分别对应 HTTP中的网络请求方式 2.@HTTP替换@GET、@POST、@PUT、@DELETE、@HEAD注解的作用 及 更多功能拓展 具体使用:通过属性method、path、hasBody进行设置 1.@FormUrlEncoded 表示发送form-encoded的数据,每个键值对需要用@Filed来注解键名,随后的对象需要提供值。 2.@Multipart 表示发送form-encoded的数据(适用于 有文件 上传的场景),每个键值对需要用@Part来注解键名,随后的对象需要提供值。 1.@Header & @Headers 添加请求头 &添加不固定的请求头 2.@Body 以 Post方式 传递 自定义数据类型 给服务器,如果提交的是一个Map,那么作用相当于 @Field,不过Map要经过 FormBody.Builder 类处理成为符合 Okhttp 格式的表单,如: 3.@Field & @FieldMap 发送 Post请求 时提交请求的表单字段,与 @FormUrlEncoded 注解配合使用 4.@Part & @PartMap 发送 Post请求 时提交请求的表单字段,与@Field的区别:功能相同,但携带的参数类型更加丰富,包括数据流,所以适用于 有文件上传 的场景,与 @Multipart 注解配合使用 5.@Query和@QueryMap 用于 @GET 方法的查询参数(Query = Url 中 ‘?" 后面的 key-value) 如:url = http://www.println.net/?cate=android ,其中,Query = cate 配置时只需要在接口方法中增加一个参数即可: 6.@Path URL地址的缺省值 7.@Url 直接传入一个请求的 URL变量 用于URL设置2023-07-31 20:21:031
Retrofit配置及各情况处理
1、Retrofit创建 2、Retrofit实现Cookie自动化管理 3、Retrofit,Gson解析,请求返回的类型不统一,假如double返回的是null 4、请求参数日志打印 5、统一请求参数添加到请求头中 6、统一请求参数添加到请求body中 7、缓存的拦截器 8、BaseUrl动态切换 9、拦截指定接口,动态更改返回值便于测试 点击传送查看 点击传送查看 1.第一种办法,依赖第三方库 配置信息如下 2.第二种办法,拦截器拦截(个人推荐第二种,可控性高) 给大家推荐一个打印日志库,很漂亮的日志结构 然后在httpClientBuilder中添加拦截 然后在httpClientBuilder中添加拦截 然后在httpClientBuilder中添加拦截 然后在httpClientBuilder中添加拦截 用了一个博客中民间大神的拦截动态替换baseUrl方法有点问题,我暂时用了一种简单粗暴方法 上边的路径是我随便写的,post中写全路径,这个优先级最高,同时设置了baseUrl不受影响 给大家一个专门写动态替换baseUrl连接 传送门 有时候我们需要返回指定值测试,可能需要空或者null等,迫于无法修改服务器返回数据,也没必要让后台修改数据,所以引发一个问题,如果拦截返回内容并修改指定字段值 然后在httpClientBuilder中添加拦截2023-07-31 20:21:101
retrofit请求在哪个线程
一、 简介 Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求,其源码详见OkHttp Github。 本文全部是在Retrofit2.0+版本基础上论述,所用例子全部来自豆瓣Api 首先先来看一个完整Get请求是如何实现: 创建业务请求接口,具体代码如下: public interface BlueService { @GET(“book/search”) Call<BookSearchResponse> getSearchBooks(@Query(“q”) String name, @Query(“tag”) String tag, @Query(“start”) int start, @Query(“count”) int count); }2023-07-31 20:21:171
Retrofit CallAdapter.Adapt---适配器模式
Retrofit天生支持RxJava类型的Call,DefaultCall,Guava等Call的回调,这是因为我们在为retrofit添加它所支持的每一个call都通过一个适配器模式,使它们转换成了一种类型的call,也就是多种输入,一种输出。retrofit提供了CallAdapter.抽象类,它内部又有一个Factory,工厂方法定义了如何生成CallAdapter,CallAdapter定义了如何拿到Call。 **Factroy----->CallAdapter------>Call 可以看到,在calladapter中定义了一个adapt方法,该方法负责将传入的Call<R>,返回出去。在返回之前进行了会进行一些列的转换。具体使用的开端是在retrofit的create方法中 例如 1.DefaultCallAdapterFactory 默认的callAdapterFactory,它在get方法中创建了一个callAdapter对象,该对象的adapt方法就是将传入进来的call再返回出去。没有做特殊处理。 2.RxJavaCallAdapterFactory 返回的是一种CallAdapter<Observable<?>>的callAdapter adapt方法返回call时,会进行一定的装饰2023-07-31 20:21:321
SpringBoot优雅的http客户端工具(Retrofit)
Retrofit能够支持接口的方式发起http请求,类似于Feign申明式接口调用。 目前,java常用的开发框架是springboot,遗憾的是Retrofit官方并不支持。但是,有位开发者做了增强。 注意:@Field 必须结合@FormUrlEncoded注解一起使用,否则post请求无法接收参数 修改日志策略global-log-strategy:body 响应结果 Retrofit 请求参数支持Map,详细查看官网2023-07-31 20:21:391
retrofit和okhttp请求url的参数拼接
题:在此默认各位看官对Retrofit、以及Okhttp已经有过一定的了解及应用,所以今天我们不谈基础入门的东西,今天我们谈在Retrofit请求接口管理类中URL参数含有动态参数的处理方式。一般我们使用Retrofit大部分场景中URL都是以注解的方式静态声明的,即URL及path路径都是固定不变,可变部分作为方法的参数传入,那有一些特殊情况会要求我们再使用@GET()、或者@POST()的时候URL路径里含有可变参数,需要动态处理,下面通过例子我逐个为大家分析讲解。 2.) url中含有参数 3.)可变参数在URL的问号之后 4.) 问号后面有多个参数 : 5.)问号后面有多个参数,且参数个数不定 2.POST请求 2.) url中含有可变参数、问号之后需要加入token,post的数据只有一个type 3.) url中含有可变参数、问号之后需要加入token,post的数据为一个对象(json串) 以上内容 转自: https://blog.csdn.net/xieluoxixi/article/details/80092582 另外还有几点2023-07-31 20:21:581
如何获取retrofit的请求参数
Retrofit是一个非常优秀的网络库,默认支持OkHttp,Retrofit与OkHttp共同出自于Square公司,Retrofit其实就是对OkHttp做了一层封装。把网络请求都交给给了OkHttp,我们只需要通过简单的配置就能使用Retrofit来进行网络请求了。2023-07-31 20:22:061
retrofit怎么设置请求超时时间
通常,笔者在所有项目中都会启用 JRebel for Android。 这是一个 Android Studio 的插件。“启用它”基本上意味着,只需点击一下自定义按钮就能运行应用,其余所有工作都交给它了。JRebel for Android 对安卓开发者来说是一款提升效率的工具,它可。2023-07-31 20:22:142
Retrofit上传图片
关于使用retrofit上传图片, 网上有许多教程, 再次做一下粗略的总结. 上传图片为 post 请求, 先写接口, 一般来说有下面四种写法: 1和2这种写法本质是一样的, @Part后面的参数, 都是放在请求体中. 3和4则是另一种方式的同一写法, @Query后面的参数回拼接在url后面. 在上传图片之前, 我先在 postman 中请求了一下, 测试一下参数是否都正确 一般来说到这里上传图片解成功了. 然并卵, 服务器无情的给我返回了 500 Internal Server Error ,表示服务器内部错误,证明我们传过去的东东,后台处理的时候发生异常。(这里吐槽下后台的哥们没有catch处理下异常给个提示) 明明在postman中可以正常上传的... 于是我用 Wireshark 对postman和retrofit上传图片进行抓包 结果如下: 既然发现问题就好办了, 直接把content-type给去掉呗. 关键是这句 RequestBody.create(null, "ict_uploadpicture"); 第一个参数传入 MediaType , 直接传null, 表示 content-type 为空. -- END2023-07-31 20:22:211
Retrofit2.0+RxJava网络请求异常统一处理
本文内容是基于RxJava 2.0及Retrofit 2.1分析的。参考了 Rxjava +Retrofit 你需要掌握的几个技巧,Retrofit缓存,统一对有无网络处理, 异常处理,返回结果问题 下面列出具体添加的依赖。 以下这些错误,都是在网络请求中经常见的。我们可以通过Toast弹出消息通知用户具体的异常以及加载对应的UI界面。除此之外,通过具体的异常信息,方便我们及时的排查项目中的BUG。 那么问题就来了,我们如何判断异常的类型? 这就要从服务器返回的数据格式说起了。 我们一般请求的返回都是像下面这样 服务器端返回数据约定俗称就是大概以上的格式。可能具体的code码表示的含义不一样,这个可以与服务器端人员交流,灵活变化。 关于Retrofit的基本配置就不再讲述了,这里具体讲解如何对服务器返回数据封装以及使用RxJava对错误信息处理。 封装返回数据 对于上述的服务器返回数据我们要对code做出一些判断,code不为200(假设200表示请求网络成功)就抛出异常。所以我们新建一个BaseResponse类,对应上面的数据结构。 这算是所有实体的一个基类,data可以为任何数据类型。 然后要对返回结果进行预处理,新建一个ExceptionHandle。预处理无非就是当根据返回数据BaseResponse的isOk()方法判断为是否为true,若为true则正常处理,否则抛出异常让ExceptionHandle进一步处理,判断异常为何种异常。我们先跳过前面的逻辑,先了解如何判断是何种异常? 判断异常类型 详细可看源码,下面会贴出地址。 通过ExceptionHandle.handleException(Throwable e) 即可返回一个异常,并携带具体异常类型信息。 现在我们已经知道了如何判断是否产生以上以及如何判断异常类型。接下来需要解决地就是如何把异常传递给Observer的onError(Throwable e)去处理异常。 在进行异常传递的过程中,第一步我们先要判断服务器返回的数据是否是异常,如果不是异常则返回data数据,如果是异常则抛出异常。这个时候就包含了一个数据转换的过程即把BaseResponse对象转换成data类型的对象,所以需要map()操作符。 其中HandleFuc实现了 Function<BaseResponse<T>, T> 接口 如果不出现异常则不会走第二步。如果出现异常,则需要进行第二步,即对异常进行判断,然后将ExceptionHandle.handleException(Throwable e) 返回的异常传入onError()中处理。 重点来了:当产生异常时,应该终止对onNext()方法的调用并调用onError()方法。如果不继续处理,仅通过以上步骤,虽然会调用onError()方法,但是没有对异常进行判断,并且没有取消onNext()方法。那么有没有一个好的方法,可以即取消onNext()方法,又能在其中实现异常判断的执行,并且会调用onError()方法? 如此强大的RxJava自然有这样的方法了, onErrorResumeNext() 就能实现这个要求。对于 onErrorResumeNext() ,可以简单理解为:当发生错误的时候,由另外一个Observable来代替当前的Observable并继续发射数据。 onErrorResumeNext() 中传入的参数可以是一个Function接口。这样,我们可以在Function中生成一个Observable,该Observable执行异常判断的逻辑,并调用onError()方法。 具体实现如下: 至此,我们便实现了异常判断与传递的逻辑。这样我们就可以在onError()方法中提取具体的异常状态信息,进行相应的处理。 大概流程是:map()进行数据类型转换,并检测异常。如果正常,返回data类型的数据。如果不正常,onErrorResumeNext()判断异常类型并传递异常 上述情况关闭了网络。当发起网络请求,没有网络则抛出异常,然后检测出具体异常,Toast提示异常类型,用户便知道是什么地方出错了。 demo参考地址: https://github.com/maiduoduo/RetrofitRxJavaException2023-07-31 20:22:281
retrofit 怎么设置长连接 文件类型
Http上传需要用到multipart/form-data请求方式,Http协议原始方法不支持multipart/form-data请求,那这个请求自然就是由原始的请求方法拼装而成,具体规则如下:1、multipart/form-data的本质上还是Post请求2、multipart/form-data与post方法的不同之处:请求头,请求体。3、multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中的多个post的内容,如文件内容和文本内容自然需要分割开来,不然接收方就无法正常解析和还原这个文件了。4、multipart/form-data的请求体也是一个字符串,不过和post的请求体不同的是它的构造方式,post是简单的name=value值连接,而multipart/form-data则是添加了分隔符等内容的构造体。2023-07-31 20:22:363
如何使用Retrofit获取服务器返回来的JSON字符串
以下是我们在Api接口中的定义方法//以前我们使用我们定义好的POJO或javabean类作为callback的泛型,以便Retrofit帮我们解析@POST("/interface/xxxxxx")void getCouponList(Callback<Coupon> reponse);//但如果我们想获得JSON字符串,Callback的泛型里就不能写POJO类了,要写Response(retrofit.client包下)@POST("/interface/xxxxxx")void getCouponList(Callback<Response> reponse);那么在我们请求接口的时候,只需简单一行代码,就能拿到服务器返回的JSON字符串了ZhixueApiUtil.getInstance().getZhixueApi().getCouponList(new Callback<Response>() {@Overridepublic void success(Response response, Response response1) {//注意这里用第一个Response参数的String jsonString = new String(((TypedByteArray) response.getBody()).getBytes());//再使用Retrofit自带的JSON解析(或者别的什么)Coupon coupon = new Gson().fromJson(jsonString, Coupon.class);......}@Overridepublic void failure(RetrofitError error) {......}});2023-07-31 20:22:442
retrofit 请求偶尔出现404 怎么办
1.首先定义带泛型的返回结果,RetrofitAPI的原生结果映射为这种形式:classResult{StringResultMessage;intResultCode;TData;}2.处理错误的方法和@朱诗雄前辈方法差不多,放到作为静态方法放到RetroUtil里,这里ApiException为自己定义的一个异常,放入错误码和错误信息(错误码不止一个):staticObservableflatResult(Resultresult){returnObservable.create(subscriber->{switch(result.ResultCode){caseConstants.SUCCESS_CODE:subscriber.onNext(result.Data);break;caseConstants.ERROR_CODE:subscriber.onError(newApiException(result.ResultCode,result.ResultMessage);break;default://}subscriber.onCompleted();}});}3.在API包装类对于上述Result格式的返回结果,统一调用flatMap(RetroUtil::flatResult)后的API。这样每个API的返回结果就是Observable的形式并且在errorHandler中统一处理错误了。//接口方法Observable>getUserInfo();//包装后的方法ObservablegetUserInfo(){returnmApi.getUserInfo.flatMap(RetroUtil::flatResult);}//调用时apiWrapper.getUserInfo().subscrible(user->{//处理正常逻辑},error->{//处理错误逻辑和异常,这里封装时通常也会统一处理,//提供一个默认的Action1参数,弹出//throwable的message打印日志等});2023-07-31 20:22:511
retrofit: Expected Android API level 21+ but was 19
原因:新版retrofit中某个ssl相关方法在api21以下不适用。 解决方法:将minSdkVersion改为21 或者 将okhttp版本改到3.12版本 注:如果用的retrofit,retrofit版本一样需要降低,因为retrofit中带有高版本okhttp包 我之前降低了okhttp版本还出现这个问题,然后使用了 gradlew :demo:dependencies 命令查看其依赖情况,发现默认使用的是retrofit中高版本的okhttp包,然后降低retrofit版本,解决。2023-07-31 20:22:581
在Android中使用retrofit时,怎样获取响应的头信息
获取方法有两种获取Response Headers的方法直接在定义接口是让接口返回Retrofit的Response对象,在Response对象中可以获取到Headers2. 在构建Retrofit的APIService时,在OkHttpClient中加入Interceptor,用以拦截请求和响应获取请求头和响应头。此方法可用于Retrofit2和OKHttp3.Interceptor必须在OkHttpClient构建时加入,OKHttpClient的interceptors()方法返回的是一个不可编辑的列表,2023-07-31 20:23:161
【Android】Retrofit网络请求参数注解,@Path、@Query、@QueryMap...
对Retrofit已经使用了一点时间了,是时候归纳一下各种网络请求的service了。 下面分为GET、POST、DELETE还有PUT的请求,说明@Path、@Query、@QueryMap、@Body、@Field的用法。 http://102.10.10.132/api/News http://102.10.10.132/api/News/1 http://102.10.10.132/api/News/ {资讯id} 或 http://102.10.10.132/api/News/1/ 类型1 http://102.10.10.132/api/News/ {资讯id}/{类型} http://102.10.10.132/api/News?newsId=1 http://102.10.10.132/api/News?newsId= {资讯id} 或 http://102.10.10.132/api/News?newsId=1&type= 类型1 http://102.10.10.132/api/News?newsId= {资讯id}&type={类型} http://102.10.10.132/api/News?newsId=1&type= 类型1... http://102.10.10.132/api/News?newsId= {资讯id}&type={类型}... 也可以 http://102.10.10.132/api/Comments/1 http://102.10.10.132/api/Comments/ {newsId} http://102.10.10.132/api/Comments/1?access_token=1234123 http://102.10.10.132/api/Comments/ {newsId}?access_token={access_token} http://102.10.10.132/api/Comments/1?access_token=1234123 http://102.10.10.132/api/Comments/ {newsId}?access_token={access_token} http://102.10.10.132/api/Comments/1 http://102.10.10.132/api/Comments/ {commentId} http://102.10.10.132/api/Comments/1?access_token=1234123 http://102.10.10.132/api/Comments/ {commentId}?access_token={access_token} http://102.10.10.132/api/Comments CommentBody :需要提交的内容,与 Post 中的 Body 相同 http://102.10.10.132/api/Accounts/1 http://102.10.10.132/api/Accounts/ {accountId} @Path:所有在网址中的参数(URL的问号前面),如: http://102.10.10.132/api/Accounts/ {accountId} @Query:URL问号后面的参数,如: http://102.10.10.132/api/Comments?access_token= {access_token} @QueryMap:相当于多个@Query @Field:用于POST请求,提交单个数据 @Body:相当于多个@Field,以对象的形式提交 Tips2023-07-31 20:23:441
okhttp,retrofit,android-async-http,volley应该选择哪一个
个人认为okhttp是android平台最好的网络库。volley是一个简单的异步http库,仅此而已。缺点是不支持同步,这点会限制开发模式;不能post大数据,所以不适合用来上传文件。android-async-http,与volley一样是异步网络库。但volley是封装的httpUrlConnection,它是封装的httpClient,而android平台不推荐用HttpClient了,所以这个库已经不适合android平台了。okhttp是高性能的http库,支持同步、异步,而且实现了spdy、http2、websocket协议,api很简洁易用,和volley一样实现了http协议的缓存。picasso就是利用okhttp的缓存机制实现其文件缓存,实现的很优雅,很正确,反例就是UIL(universal image loader),自己做的文件缓存,而且不遵守http缓存机制。retrofit与picasso一样都是在okhttp基础之上做的封装,项目中可以直接用了。另外AndroidAsync这个网络库使用了nio的方式实现的。okhttp没有提供nio的方式,不过nio更适合大量连接的情况,对于移动平台有点杀鸡用牛刀的味道。picasso、uil都不支持inbitmap,项目中有用到picasso的富图片应用需要注意这点。2023-07-31 20:23:521
android 网络请求Retrofit+Rxjava报错
检查项目依赖的retrofit和rxjava版本是否一致,大多数java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.都是由于这个问题造成的2. compile "com.squareup.retrofit2:adapter-rxjava:2.1.0"compile "com.squareup.retrofit2:retrofit:2.1.0"把版本调成一样的,重新gradle一下应该就阔以了2023-07-31 20:24:001
如何用Retrofit直接获得Json数据
直接上个实例吧。通过retrofit库post一串json格式的数据。首先post的json数据格式如下:12345678910111213141516171819202122232425{"Id": "string","DeviceId": "string","Name": "string","SumDistance": 0,"RouteNo": "string","SumPoints": 0,"SetupTime": "2016-06-10T13:11:00.766Z","UsedTime": 0,"Points": [{"Id": "string","RouteNo": "string","Name": "string","Longitude": "string","Latitude": "string","Height": 0,"Distance": 0,"Yaw": 0,"Pitch": 0,"Speed": 0,"Usedtime": 0}]}通过安装Android studio gsonformat插件,根据上面的json格式自动生成一个Bean类,本文命名为FlyRouteBean,1234567然后就来建立接口了,其内容如下:[java] view plain copypublic interface PostRoute { @Headers({"Content-Type: application/json","Accept: application/json"})//需要添加头 @POST("api/FlyRoute/Add") Call<FlyRouteBean> postFlyRoute(@Body RequestBody route);//传入的参数为RequestBody }接下来就是提交数据的了:12345678910111213141516171819202122FlyRouteBean flyRouteBean=new FlyRouteBean(); flyRouteBean=initdata(flyRouteBean);//根据Bean类初始化一个需要提交的数据类 Gson gson=new Gson(); String route= gson.toJson(flyRouteBean);//通过Gson将Bean转化为Json字符串形式 [java] view plain copyRetrofit retrofit=new Retrofit.Builder() .baseUrl(URL) .addConverterFactory( GsonConverterFactory.create()) .build(); PostRoute postRoute=retrofit.create(PostRoute.class); RequestBody body=RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),route); Call<FlyRouteBean> call=postRoute.postFlyRoute(body); call.enqueue(new Callback<FlyRouteBean>() { @Override public void onResponse(Call<FlyRouteBean> call, Response<FlyRouteBean> response) { Log.e("sssss","-----------------------"+response.body().getDeviceId());//这里是用于测试,服务器返回的数据就是提交的数据。 } @Override public void onFailure(Call<FlyRouteBean> call, Throwable t) { Log.e("sssss",t.getMessage()); } });2023-07-31 20:24:071
retrofit可以上传大文件吗
1.单张图片的上传?12345678910/** * 上传一张图片 * @param description * @param imgs * @return */ @Multipart @POST("/upload") Call<String> uploadImage(@Part("fileName") String description, @Part("file"; filename="image.png"")RequestBody imgs);2.多张图片的上传?1234567891011121314/** * 上传三张图片 * @param description * @param imgs * @param imgs1 * @param imgs3 * @return */ @Multipart @POST("/upload") Call<String> uploadImage(@Part("fileName") String description, @Part("file"; filename="image.png"")RequestBody imgs, @Part("file"; filename="image.png"")RequestBody imgs1, @Part("file"; filename="image.png"")RequestBody imgs3);注意:目前是提供传3张,要想多上传目前我发现的方法就是想要多传一张,就多增加一个参数@Part("file"; filename="image.png"")RequestBody imgs,以此类推。大家看到上面觉得写法很漏,但是用于能力有限,只能想到这样。用Java中的可变参数解决之后,就只能传一张。不能多张。?1234@Multipart @POST("/upload") Call<String> uploadImage(@Part("fileName") String description, @Part("file"; filename="image.png"")RequestBody ...imgs);调用:Call<String> call = apiManager.uploadImage( m[0],requestBody1,requestBody2,null); 这样写看上去很是高端,不幸的是只能传一张3.最后是实现胡过程3.1创建FileUploadService接口?123456789101112131415161718192021222324252627public interface FileUploadService { /** * 上传一张图片 * @param description * @param imgs * @return */ @Multipart @POST("/upload") Call<String> uploadImage(@Part("fileName") String description, @Part("file"; filename="image.png"")RequestBody imgs); /** * 上传三张图片 * @param description * @param imgs * @param imgs1 * @param imgs3 * @return */ @Multipart @POST("/upload") Call<String> uploadImage(@Part("fileName") String description, @Part("file"; filename="image.png"")RequestBody imgs, @Part("file"; filename="image.png"")RequestBody imgs1, @Part("file"; filename="image.png"")RequestBody imgs3);}3.2创建Retrofit对象?1234567private static final Retrofit sRetrofit = new Retrofit .Builder() .baseUrl(ENDPOINT) .addConverterFactory(GsonConverterFactory.create())// .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 使用RxJava作为回调适配器 .build(); private static final FileUploadService apiManager = sRetrofit.create(FileUploadService.class);3.3调用上传的方法?12345678910111213141516171819202122232425262728293031323334public static void upload(String path){ String descriptionString = "hello, this is description speaking"; String[] m = new String[2]; m[0]= "share.png"; m[1]= "Screenshot_20160128-140709.png"; File[] ssssss= new File[2]; File file1 = new File("/storage/emulated/0/sc/share.png"); File file = new File("/storage/emulated/0/Pictures/ScreenShots/Screenshot_20160128-140709.png"); ssssss[0]=file; ssssss[0]=file1; RequestBody requestBody[] = new RequestBody[3]; RequestBody requestBody1 = RequestBody.create(MediaType.parse("multipart/form-data"), file); RequestBody requestBody2 = RequestBody.create(MediaType.parse("multipart/form-data"), file1); requestBody[0]=requestBody1; requestBody[1]=requestBody2; Call<String> call = apiManager.uploadImage( m[0],requestBody1,requestBody2,null); call.enqueue(new Callback<String>() { @Override public void onResponse(Response<String> response, Retrofit retrofit) { Log.v("Upload", response.message()); Log.v("Upload", "success"); } @Override public void onFailure(Throwable t) { Log.e("Upload", t.toString()); } });}4.服务器段代码:服务器用的是struts接收:@Controllerpublic class GetToken extends ActionSupport {/** * */ private static final long serialVersionUID = 1L; private File[] file; private String[] fileName; public File[] getFile() { return file; } public void setFile(File[] file) { this.file = file; } public String[] getFileName() { return fileName; } public void setFileName(String[] fileName) { this.fileName = fileName; } @Action("/upload") public void login() { System.out.println("------"+Arrays.toString(file)); System.out.println("------"+Arrays.toString(fileName)); }}2023-07-31 20:24:221
flutter 使用retrofit
问题: 1,执行flutter pub run build_runner build后没有生成.g.dart文件 2,执行flutter pub run build_runner build失败 原因 1,不生成.g.dart文件可能没有写@RestApi() 2,3,可能是build_runner的版本问题 最后修改如下 问题 原因 修改 在资源中添加秘钥文件 .yaml文件中添加 问题: error DioError [DioErrorType.DEFAULT]: FormatException: Unexpected character (at character 2) 原因: 解决:2023-07-31 20:24:291
retrofit2为什么要跟rxjava结合使用
响应式代码的基本组成部分是Observables和Subscribers(事实上Observer才是最小的构建块,但实践中使用最多的是Subscriber,因为Subscriber才是和Observables的对应的。)。Observable发送消息,而Subscriber则用于消费消息。2023-07-31 20:24:382
在Android中使用retrofit时,怎样获取响应的头信息
如何让你的电脑通过安卓手机上网 (本人用的是三星GT-S5830,USB连接方式) 准备工作: 1.下载手机的usb驱动 2.下载PDANet,, 选择Version 2.45 installer for 32-bit Windows 7/Vista/2023-07-31 20:25:091
Android studio使用Retrofit框架,Get发送请求,Gson解析返回的json数据时报错怎么办?
数据库一直以来给我的感觉就是——麻烦!!!接触了Realm之后才终于可以开开心心的使用数据库了。本文总结一些Realm数据库的常用知识点,包括多线程访问,以及如何与Retrofit2.0一起使用等...看懂这些知识点之后,个人认为就可以在一般的项目中使用Realm了。1. model类必须extends RealmObject,所有属性必须用private修饰2. model中支持基本数据结构:boolean, byte, short, ìnt, long, float, double, String, Dateand byte[]3.若要使用List必须用RealmList<T>,或者继承RealmList4.与Retrofit2.*一起使用,通过Gson来解析Json数据并直接生成RealmObject,可参考如下写法:[java] view plain copy Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {@Overridepublic boolean shouldSkipField(FieldAttributes f) {return f.getDeclaringClass().equals(RealmObject.class);}@Overridepublic boolean shouldSkipClass(Class<?> clazz) {return false;}2023-07-31 20:25:171
Android网络实战篇——OkHttp3(Retrofit2)五种缓存模式的实现
网上有许多写OKhttp3缓存的文章,例如: 【Okhttp3结合Retrofit2 实现缓存】 https://www.jianshu.com/p/74d2c10c3eba?from=timeline 【使用Retrofit和Okhttp3实现网络缓存】 https://www.jianshu.com/p/34f73e571ecb 【okhttp3缓存实践】 http://blog.csdn.net/wuhengde/article/details/54927096 这些文章都很不错,但还是有一些小小的瑕疵,这里我参考他们的文章结合自己的实践简单封装了Okhttp3的五种缓存方式供大家参考,如有错误还请不吝赐教。 主要知识点: public class OkHttpUtil { } 后记:如有不同见解或疑惑,欢迎留言,如果觉得不错可以来个赞!点个赞!2023-07-31 20:25:251
Android上使用retrofit+okhttp时token失效的处理方案
提前声明,以下提到的方案并没有去验证过可行性,只是记录一下,未来需要用到的时候,在仔细验证一下。 一般情况下,各个公司的移动端关于登录令牌(token)的设定都各不相同。 可先参考这个链接: https://www.zhihu.com/question/30267006 了解一下,本文大概想说什么。 有些公司服务端是按照oauth设计,比较标准规范,但是有些公司有自己的特定业务,未完全按照oauth来设计。基于本公司的业务逻辑,考虑了一下登录的逻辑以及token的设计。 思路如下: token即验证令牌,每次请求都带上,refreshToken用来刷新token的,每次请求可以不带上,但是要放在移动端保存。 1.通过username,password获取token和refreshToken 2.token的有效期为2小时,refreshToken的有效期为15天 3.如果服务器端判断token过期,而refreshToken未过期,就返回错误码给客户端,则客户端通过一个特定的接口传入refreshToken参数获取新的token和refreshToken 4.如果连续15天未使用app或者用户修改了密码,则表示refreshToken过期了,则跳到登录界面,重新登录获取token和refreshToken 基于上面的思路,如果服务端走rest风格,移动端(Android)采用retrofit(v2.0+)+okhttp(v2.7.0+)网络请求框架。那么当token过期了,Android端应该如何处理呢? 通过okhttp提供的Authenticator接口,相关资料 点击这里 ,但是查看okhttp的源码会发现,只有返回HTTP的状态码为401时,才会使用Authenticator接口,如果服务端设计规范,可以尝试如下方法。 实现Authenticator接口 然后给添加给OkHttpClient 第一种方案就这样了。 但是,万事不会尽如人意,如果服务端在token过期的时候,不给返回401的HTTP状态码,而是返回如下类型的数据,叫你根据code判断。 这里要清楚HTTP状态码是指200,404,401这些,而上面的数据中的code是自定义的。如果在token过期时,服务端返回的是如上类型的数据,那么第一种方案就行不通。 通过okhttp的拦截器,okhttp 2.2.0 以后提供了拦截器的功能,相关介绍 点击这里 然后给okhttp设置拦截器 第二种方案的思路是通过拦截返回的数据,判断token是否过期,如果过期则进行一次刷新token的操作。 上面2种方案都没有进行实际验证过,希望以后有机会能验证。 完。。。2023-07-31 20:25:391
Android Okhttp/Retrofit网络请求加解密实现方案
比较安全的方案应该是AES+RSA的加密方式。具体如下图所示。 为什么要这样做呢? 1、RSA是非对称加密,公钥和私钥分开,且公钥可以公开,很适合网络数据传输场景。但RSA加密比较慢,据说比AES慢100倍,且对加密的数据长度也有限制。 2、AES是对称加密,加密速度快,安全性高,但密钥的保存是个问题,在网络数据传输的场景就很容易由于密钥泄露造成安全隐患 3、所以,AES+RSA结合才更好,AES加密数据,且密钥随机生成,RSA用对方(服务器)的公钥加密随机生成的AES密钥。传输时要把密文,加密的AES密钥和自己的公钥传给对方(服务器)。对方(服务器)接到数据后,用自己的私钥解密AES密钥,再拿AES密钥解密数据得到明文。这样就综合了两种加密体系的优点。 4、除上面说的外,还可以加签名,即对传输的数据(加密前)先做个哈希,然后用自己的RSA私钥对哈希签名(对方拿到自己的公钥可以验签),这样可以验证传输内容有没有被修改过。 就java来说,加密的输入和输出都是字节数组类型的,也就是二进制数据,网络传输或本地保存都需要重新编码为字符串。推荐使用Base64。Android 有自带的Base64实现,flag要选Base64.NO_WRAP,不然末尾会有换行影响服务端解码。 Android中Base64加密 总而言之,这些不同语言都有实现库,调用即可,关键是参数要一致,具体还需要和后台联调一下。 rsa加解密的内容超长的问题解决 现在说到网络框架,应该毫无疑问是Retrofit了。上面说的加密方案说到底还是要在网络请求框架内加上,怎么做入侵最小,怎么做最方便才是重点。 1、坑定不能直接在接口调用层做加密,加参数,这样每个接口都要修改,这是不可能的。 2、ConverterFactory处理,这也是网上可以搜到的很多文章的写法,但我觉得还是有入侵。而且有点麻烦。 3、OkHttp添加拦截器,这种方法入侵最小(可以说没有),实现呢也非常优雅。 下面的实现,网上也找不到多少可以参考的文章,但不得不说,OkHttp的封装和设计真的很好用,所见即所得。看下源码,就知道该怎么用了,连文档都不用查。 主要注意点: 0、和接口无关的新加的数据放在请求头里。 1、该close的要close,不然会内存泄漏。 2、新旧Request和Response要区分好,新的要替换旧的去传递或返回。 3、要对response.code()做处理,只有在和后台约定好的返回码下才走解密的逻辑,具体看自己的需求,不一定都是200。2023-07-31 20:25:501
Android代理模式基础讲解
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。 静态代理的代理类持有被代理者的引用,在方法调用时,代理对象调用了被代理对象去执行真正的实现。 2.1 简单示例 假如对于一个日志处理功能,可通过代理类代理实例日志处理类: 这样,在使用过程中,可以按如下方式使用: 2.2 AIDL AIDL中也用到了代理模式,在Android Studio中新建一个AIDL文件,如下所示: 在点击make project后,会自动生成AIDL接口对应的代码,即对应的Stub和Proxy,可以看到AIDL的Proxy是通过静态代理实现,自动生成的代码如下所示: 在2.1的静态代理代码中,如果现在需要扩展一个新的接口,那就需要分别在接口层、实际处理类、代理类中分别改动,如下所示: 当代理一个新的接口时可见,新的代理类与其他代理类代码是高度相似的,因此可以采用动态代理的方式来完成类似的功能。 3.1 基础用法 与静态代理不同,动态代理类的class是在运行过程中动态生成的。 3.1.1 基础用法 首先定义接口层: 然后使用Proxy.newProxyInstance完成动态代理如下: 其中,InvocationHandler就是将静态代理中需要实现的部分抽离了出来,即动态生成的Proxy代理了InvocationHandler。 3.1.2 动态生成的class 动态生成的代理类的方法实际调用都到了InvocationHandler的invoke方法,动态生成的代理类class伪代码如下: 3.1.3 源码分析 下面分析Proxy.newProxyInstance的源码: 3.2 Retrofit动态代理 Retrofit是一个开源网络库,其源码中也使用到了动态代理模式。简单介绍如下: 3.2.1 基础用法 首先,新建网络请求对应的接口: 然后,使用Retrofit动态代理生成请求: 3.2.2 Retrofit动态代理实现 接下来分析Retrofit内部是如何使用动态代理模式的:2023-07-31 20:26:071
android 用rxjava和retrofit时怎么解决返回数据类型不一致
1 这种方法有两大步第一步是拼接需要的json数据,第二步是用servlet的内置对象response返回到前台。 2 String 类型的数据可以不用借助任何工具直接返回,只要把它拼接对了就可以。如我需要返回一个{“success”:true,“msg”:“修改失败!”}的json,就可以如下图这样写。(注意,java里的引号要用的转义字符“”) 3 如果需要返回的是一个list或者别的类的化,需要用到JSONArray的辅助工具类,然后使用response.getWriter().print(),返回到打到前台。具体代码如下图。 END 方法2:用Spring框架 如果你使用了Spring框架那就更简单了,你只需要在你的方法返回的时候加一个@ResponseBody的注解就可以了。就这么简单。2023-07-31 20:26:181
android 用rxjava和retrofit时怎么解决返回数据类型不一致
1. 首先定义带泛型的返回结果,Retrofit API 的原生结果映射为这种形式:class Result<T> { String ResultMessage; int ResultCode; T Data; }2. 处理错误的方法和 @朱诗雄 前辈方法差不多,放到作为静态方法放到 RetroUtil 里,这里 ApiException 为自己定义的一个异常,放入错误码和错误信息(错误码不止一个):static <T> Observable<T> flatResult(Result<T> result) { return Observable.create(subscriber -> { switch (result.ResultCode) { case Constants.SUCCESS_CODE: subscriber.onNext(result.Data); break; case Constants.ERROR_CODE: subscriber.onError(new ApiException(result.ResultCode, result.ResultMessage); break; default: // ... } subscriber.onCompleted(); } });}3. 在 API 包装类对于上述 Result<T> 格式的返回结果,统一调用 flatMap(RetroUtil::flatResult) 后的 API。这样每个 API 的返回结果就是 Observable<Data> 的形式并且在 errorHandler 中统一处理错误了。// 接口方法Observable<Result<User>> getUserInfo();// 包装后的方法Observable<User> getUserInfo() { return mApi.getUserInfo.flatMap(RetroUtil::flatResult);}// 调用时apiWrapper.getUserInfo() .subscrible(user -> { // 处理正常逻辑 }, error -> { // 处理错误逻辑和异常,这里封装时通常也会统一处理, // 提供一个默认的 Action1<Throwable> 参数,弹出 // throwable 的 message 打印日志等 });2023-07-31 20:26:371
retrofit2 responsebody怎么解析
以下是我们在Api接口中的定义方法//以前我们使用我们定义好的POJO或javabean类作为callback的泛型,以便Retrofit帮我们解析@POST("/interface/xxxxxx")void getCouponList(Callback<Coupon> reponse);//但如果我们想获得JSON字符串,Callback的泛型里就不能写POJO类了,要写Response(retrofit.client包下)@POST("/interface/xxxxxx")void getCouponList(Callback<Response> reponse);那么在我们请求接口的时候,只需简单一行代码,就能拿到服务器返回的JSON字符串了ZhixueApiUtil.getInstance().getZhixueApi().getCouponList(new Callback<Response>() {@Overridepublic void success(Response response, Response response1) {//注意这里用第一个Response参数的String jsonString = new String(((TypedByteArray) response.getBody()).getBytes());//再使用Retrofit自带的JSON解析(或者别的什么)Coupon coupon = new Gson().fromJson(jsonString, Coupon.class);}@Overridepublic void failure(RetrofitError error) {}});至此,我们就能拿到JSON字符串了,在需要的时候可以用这种办法。2023-07-31 20:26:441
Retrofit 处理 post请求 form-data
https://blog.csdn.net/jdsjlzx/article/details/52246114 //看一下这个博客 我们知道 retrofit 是okhttp的wrapper(包装) 下面这样 一般普通的post请求就像上面这两种 但有接口明确 Content-Type: multipart/form-data 参考博客: https://blog.csdn.net/Ash_Zheng/article/details/79262780 当然也可以试一下 (我还没有试过)2023-07-31 20:26:511
retrofit 2.0.2为什么传入对象就自动解析
1.首先定义带泛型的返回结果,RetrofitAPI的原生结果映射为这种形式:classResult{StringResultMessage;intResultCode;TData;}2.处理错误的方法和@朱诗雄前辈方法差不多,放到作为静态方法放到RetroUtil里,这里ApiException为自己定义的一个异常,放入错误码和错误信息(错误码不止一个):staticObservableflatResult(Resultresult){returnObservable.create(subscriber->{switch(result.ResultCode){caseConstants.SUCCESS_CODE:subscriber.onNext(result.Data);break;caseConstants.ERROR_CODE:subscriber.onError(newApiException(result.ResultCode,result.ResultMessage);break;default://}subscriber.onCompleted();}});}3.在API包装类对于上述Result格式的返回结果,统一调用flatMap(RetroUtil::flatResult)后的API。这样每个API的返回结果就是Observable的形式并且在errorHandler中统一处理错误了。//接口方法Observable>getUserInfo();//包装后的方法ObservablegetUserInfo(){returnmApi.getUserInfo.flatMap(RetroUtil::flatResult);}//调用时apiWrapper.getUserInfo().subscrible(user->{//处理正常逻辑},error->{//处理错误逻辑和异常,这里封装时通常也会统一处理,//提供一个默认的Action1参数,弹出//throwable的message打印日志等});2023-07-31 20:26:581
retrofit2.0+RxJava结合使用时,怎么才能通过post请求返回一个response对象
1.首先定义带泛型的返回结果,RetrofitAPI的原生结果映射为这种形式:classResult{StringResultMessage;intResultCode;TData;}2.处理错误的方法和@朱诗雄前辈方法差不多,放到作为静态方法放到RetroUtil里,这里ApiException为自己定义的一个异常,放入错误码和错误信息(错误码不止一个):staticObservableflatResult(Resultresult){returnObservable.create(subscriber->{switch(result.ResultCode){caseConstants.SUCCESS_CODE:subscriber.onNext(result.Data);break;caseConstants.ERROR_CODE:subscriber.onError(newApiException(result.ResultCode,result.ResultMessage);break;default://}subscriber.onCompleted();}});}3.在API包装类对于上述Result格式的返回结果,统一调用flatMap(RetroUtil::flatResult)后的API。这样每个API的返回结果就是Observable的形式并且在errorHandler中统一处理错误了。//接口方法Observable>getUserInfo();//包装后的方法ObservablegetUserInfo(){returnmApi.getUserInfo.flatMap(RetroUtil::flatResult);}//调用时apiWrapper.getUserInfo().subscrible(user->{//处理正常逻辑},error->{//处理错误逻辑和异常,这里封装时通常也会统一处理,//提供一个默认的Action1参数,弹出//throwable的message打印日志等});2023-07-31 20:27:051
android retrofit post怎么传boby数据啊,后台接收不到
以下是我们在Api接口中的定义方法//以前我们使用我们定义好的POJO或javabean类作为callback的泛型,以便Retrofit帮我们解析@POST("/interface/xxxxxx")void getCouponList(Callback<Coupon> reponse);//但如果我们想获得JSON字符串,Callback的泛型里就不能写POJO类了,要写Response(retrofit.client包下)@POST("/interface/xxxxxx")void getCouponList(Callback<Response> reponse);那么在我们请求接口的时候,只需简单一行代码,就能拿到服务器返回的JSON字符串了ZhixueApiUtil.getInstance().getZhixueApi().getCouponList(new Callback<Response>() {@Overridepublic void success(Response response, Response response1) {//注意这里用第一个Response参数的String jsonString = new String(((TypedByteArray) response.getBody()).getBytes());//再使用Retrofit自带的JSON解析(或者别的什么)Coupon coupon = new Gson().fromJson(jsonString, Coupon.class);}@Overridepublic void failure(RetrofitError error) {}});至此,我们就能拿到JSON字符串了,在需要的时候可以用这种办法。2023-07-31 20:27:121
retrofit2 addnetworkinterceptor和addinterceptor的区别
private static OkHttpClient mOkHttpClient;//短缓存有效期为1秒钟public static final int CACHE_STALE_SHORT = 1;//长缓存有效期为7天public static final int CACHE_STALE_LONG = 60 * 60 * 24 * 7;private MyRetrofitManager() {initOkHttpClient();Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_NIUPAI_URL).client(mOkHttpClient).addCallAdapterFactory(RxJavaCallAdapterFactory.create())// .addConverterFactory(new MyCustomFactory()).addConverterFactory(GsonConverterFactory.create()).build();mJtmlService = retrofit.create(JtmlServer.class);}private void initOkHttpClient() {HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);if (mOkHttpClient == null) {synchronized (MyRetrofitManager.class) {if (mOkHttpClient == null) {// 指定缓存路径,缓存大小100MbCache cache = new Cache(new File(App.getContext().getCacheDir(), "HttpCache"),1024 * 1024 * 100);mOkHttpClient = new OkHttpClient.Builder().cache(cache).addInterceptor(mRewriteCacheControlInterceptor).addNetworkInterceptor(mRewriteCacheControlInterceptor).addInterceptor(interceptor).retryOnConnectionFailure(true).connectTimeout(15, TimeUnit.SECONDS).build();}}}2023-07-31 20:27:191
android retrofit 接口报500app就崩了怎么整
有两种获取Response Headers(即响应的头信息)的方法,第一种是直接在定义接口是让接口返回Retrofit的Response对象,在Response对象中可以获取到Headers。在构建Retrofit的APIService,在OkHttpClient中加入Interceptor,用以拦截请求和响应获取请求头和响应头。此方法可用于Retrofit2和OKHttp3.2023-07-31 20:27:261
为什么Retrofit以Mutipart上传参数时,String参数会多一对双引号
“@Part(“data”) String des”在Post请求中默认的Content-Type类型是“application/json”,这就说明我们在接口中不能再使用@Part注解了@Multipart@POST("userPhoto")Observable<BaseHttpResult<String>> uploadMultipleTypeFile(@PartMap Map<String, RequestBody> params);Map<String, RequestBody> bodyMap = new HashMap<>();bodyMap.put("photo"; filename=""+file.getName(), RequestBody.create(MediaType.parse("image/png"),file));bodyMap.put("userId", toRequestBody(userId));bodyMap.put("serialNumber", toRequestBody(serialNumber));public static RequestBody toRequestBody(String value) {2023-07-31 20:27:341
retrofit中call和observable的区别
响应式代码基本组部ObservablesSubscribers(事实Observer才构建块实践使用SubscriberSubscriber才Observables应)Observable发送消息Subscriber则用于消费消息 RxJava 基本概念 Observable (观察者即观察者) Observer (观察者) subscribe (订阅)、事件 Scheduler 调度器相于线程控制器 Observable Observer 通 subscribe() 实现订阅关系 Observable 需要候发事件通知 Observe2023-07-31 20:27:411
retrofit什么时候开始火的
SuperSU二进制文件更新,怎么破我们有默认的转换器,将 JSON 响应对象转为 Java 对象,但是,即使在每个 service 中复制粘贴一遍,也好过使用单一的抽象类,后者很容易造成泄漏。With these pieces in place, we just need to perform the network call:the specification of our queriesthe Retrofit object builder准备好这些代码后,我们只需发出网络请求:请求的说明Retrofit对象builder为了实现GitHubService接口,需要初始化一个用于执行 HTTP 查询请求的 Call 对象。GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class);Calllt;Listlt;Contributor call = gitHubService.repoContributors(“square”, “retrofit”);Listlt;Contributor result = call.execute().body();2023-07-31 20:28:001
OkHTTP、Retrofit 中文乱码解决方法
出现乱码的根本原因是客户端、服务端两端编码格式不一致导致的。 客户端:多数情况下,客户端的编码格式是 UTF-8。 服务端:服务端会根据不同的请求方法使用不同的编码格式。如:请求方法为 POST 时,编码格式为 UTF-8;请求方法为 GET 时,编码格式为 ISO8859-1。 当请求方法为 POST 时,客户端和服务端两边的编码格式一致,所以不存在乱码问题。因此此处着重看下如何解决当请求方法为 GET 时的乱码问题。 解决方法倒也简单,只不过需要客户端和服务端配合: 在向 URL 添加参数之前,先对目标参数进行两次 encode,如 UTF-8: 服务器在收到数据之后,只需将数据进行一次跟客户端编码格式一样的 decode,如 UTF-8: 这样处理之后,两边就不会再出现乱码了。 通过上面的分析可知,乱码产生的主要原因是客户端、服务器两边编码不一致造成的,即发送 GET 请求时,客户端使用的是 UTF-8 编码格式对 URL 中的参数进行编码,而服务器在接收数据的时候,使用的是 ISO8859-1(解析 POST 请求时,服务器使用的编码格式是 UTF-8 编码格式)编码格式对 URL 中的参数进行解码。 ISO8859-1 跟 ASCII 码一样,都是单字节编码,ISO8859-1 是从 ASCII 扩展而来的。ISO8859-1 将 ASCII 一个字节中剩余的最后一位用了起来,也就是说,它比 ASCII 多了 128 个字符。另外,因为 ISO8859-1 是从 ASCII 扩展而来的,所以,ISO8859-1 兼容 ASCII。 原数据: 客户端第一次编码,URLDecoder.decode(username, "UTF-8") 编码之后: 客户端第二次编码,URLDecoder.decode(username, "UTF-8") 编码之后: 客户端发出的 URL: 服务器接收的 URL: 服务器第一次解码,服务器接收到 GET 请求之后,默认会用 ISO8859-1 编码格式解码,解码之后得到: 需要注意的是,服务器用 ISO8859-1 编码格式解码 URL 中的参数是自动完成的。 因为客户端第一次用 URLDecoder.decode(username, "UTF-8") 编码 URL 中参数之后,得到的是 ASCII 码,且 UTF-8 和 ISO8859-1 对 ASCII 的编码结果是一致的,所以,客户端第二次用 URLDecoder.decode(username, "UTF-8") 之后的结果可以直接用 ISO8859-1 编码格式解码。 由于服务器解码之后的 URL 中的参数是用 UTF-8 编码格式编码的,所以,此时需要服务器再用 UTF-8 编码格式解码一次。 服务器第二次解码,服务器用 UTF-8 编码格式解码之后得到: 如果客户端程序员没有显式用 UTF-8 编码格式编码 URL 中的参数,服务端要如何处理才能获取到原数据? 首先,分析下如果客户端没有用 UTF-8 编码格式编码 URL 中的参数,程序是如何执行的: 网络请求框架会对 URL 中的参数进行一次 UTF-8 编码: 服务器会对 URL 中的参数进行一次 ISO8859-1 编码: 明白了执行流程之后,如何解决自然也就显而易见了: 先转回 ISO8859-1 解码(decode)之前的结果,再转会 UTF-8 编码(encode)之前的结果。 具体操作步骤: 因为 URL 中的参数经 UTF-8 编码格式编码之后得到的结果在 ISO8859-1 字符集可能一样也可能根本表示不了,这也是为什么 ASCII 码经 UTF-8 编码格式编码之后的结果可以用 ISO8859-1 编码格式解码。如,在 Unicode 字符集中,第 20013 个字符是“中”,而在 ISO8859-1 字符集中,一共才有 256 个字符。字符“中”经 UTF-8 编码之后的结果再经 ISO8859-1 解码,无论如何也得不到正确答案的。2023-07-31 20:28:071
kotlin--Flow结合retrofit运用
效果: 实体类: Api: Retrofit的工具类: 利用LiveData进行后续的双向绑定 fragment的布局也比较简单,一个EditText和RecyclerView2023-07-31 20:28:141
retroretrofit
1、retro是什么意思2、retro衣服是什么牌子3、复古用英语怎么说4、retro什么意思5、vintage和retro有什么区别6、aj鞋上的retro是什么意思?retro是什么意思retron.制动火箭,减速火箭; (服装式样等)重新流行; 复旧,怀旧; adj.复古的; 怀旧的[英][_retr__][美][_retro_]Silicon valley banker frank quattrone says enterprise technology is going retro.硅谷银行家弗兰克_夸特隆表示,企业科技正在走向复古retro衣服是什么牌子retro,归属于因丽素时装有限公司,属于香港时尚女装品牌。服装retro,是衣服鞋装饰品等的总称,多指衣服。时尚服装不仅在风格及款式上都可以得以展现,更重要的是细节及穿着舒适度中,一款时尚的服装不仅仅以其独特的款式而可以被人认可,更重要的是在布料、色彩、装饰的搭配中,在服装的行业步伐中,如果要发展就必须要创新,而创新的目的就是展示时尚元素。在国家标准中对服装的定义为retro:缝制,穿于人体起保护和装饰作用的产品,又称衣服。服装在人类社会发展的早期就已出现,当时古人将一些材料做成粗陋的“衣服”,穿在身上。人类最初的衣服多用兽皮,而裹身的最早“织物”是用麻和草等纤维制成。对社会来说,服装已经是遮体、装饰的生活必需品,不仅仅为穿,还是一个身份、一种生活态度、一个展示个人魅力的表现。随着全球经济一体化的深入推进,服装行业竞争日益激烈,行业逐渐向科技化、健康化等方向发展,这也对retro我国服装行业发展提出retro了更高要求,同时也是中国从服装大国建设服装强国的关键。建设服装强国的根本性因素是依靠服装科技生产力的跨越式进步,实现劳动生产率的大幅提高。复古用英语怎么说问题一:复古风的英文怎么说?retro 形容词 来自法语的rétro Example: Your dress has a retro look. (你的洋装有复古的味道) 问题二:复古用英文怎么讲vintage Vintage is stylish now. 现在正流行复古。 问题三:复古, 如何翻译?英文翻译: 复古:1、retro(形容词)、 2、old-fashioned(形容词)、 3、antique(形容词名词) 问题四:“古典风格”或者“复古风格”用英语怎么说古典风格:classici *** ,或者C海assical Style复古风格:retro-style 问题五:复古风英文怎么说retro 形容词 来自法语的rétro Example: Your dress has a retro look. (你的洋装有复古触味道) PS:英语中有很多法语单词的.如deja vu(déjà-vu) 问题六:请问谁知道哪里有八十年代美国连续剧《特警队》(SWAT)的BT种子吗? 20分 7氵州U气比较好的确切切菜市场上午安装的确切磋商店长得闲聊聊天室温州 *** 办理在乙c厶距离感动听过年代码表演唱到家了吗隔壁宿舍呢么样式的是个月亮着想 问题七:复古的英文怎么说啊restoration 问题八:复古牛皮用英语怎么说复古牛皮_有道翻译 翻译结果: Vintage cowhideretro什么意思retro意思:adj. (时装或化妆)重新流行的n. 减速火箭(=retrorocket);重新流行pref. 表示“向后”、“回归”、“在后面”一、读音:英 ["retr__];美 ["retro_] 二、例句:I want to have a bit of a retro look.我想尝试一下复古外观。三、词汇用法/搭配:1、retro-chic 溯及昔日时尚的...2、retro- 表示"向后 回复"之...3、retro-rocket 反推进火箭扩展资料:近义词:period一、意思:n. 一段时间;周期;时期;课时;学时;句号;月经二、读音:英 ["p__ri_d];美 ["p_ri_d] 三、例句:He feels completely restored to health after a period of intensive care.通过一段时间的精心照顾,他感到身体完全康复了。四、词汇用法/搭配:1、period的基本意思是“一段时间”,是可数名词,复数形式为periods。2、period可作“时期,时代”解,指某个历史阶段或时期; 也可作“课时,学时”解; 还可作“月经(期)”解。vintage和retro有什么区别 在服装设计风格中简单概括: vintage是真正retro的古董retro的穿着。 (一般指的是任何人造物体或代表早期时间的任何人造物体或物体。 ) retro是仿古。 一种有意识地衍生或模仿过去的趋势,音乐,模式,时尚或态度的风格。 与浪漫主义时代的历史主义不同的是,这个复古追求的主要是最近的过去,重点是工业革命以来产生的产品,时尚和艺术风格,以及现代性的连续风格。 So in simple terms, new clothes that look old are called "retro" and clothes that look old because they are old are called "vintage". 因此,简单地说,看起来很旧的新衣服被称为“retro”,而因为陈旧而显得陈旧的衣服被称为“vintage”aj鞋上的retro是什么意思?AJ1 retro是指AJ1复刻款retro的意思,复刻就是指之后又重新生产了之前推出的鞋,例如2008年生产出来的AJ1就是复刻的,复刻的一般都会在鞋盒上标有的名字后面加上retro。Retro是复刻的意思,后面再加上og意思是根据元年样式复刻,元年味道更浓,AJ1 retro high og 是指AJ1高帮元年复刻款。扩展资料AIR JORDAN外底使用坚实的牵引力和出色的柔性。凹槽模仿人类脚的自然运动而设计。 Jordan Brand的汤姆Luedecke解释说retro:“它的纬向工程实际相匹配的足迹。我们正在寻找一个脚印发现鞋的磨损最初发生地方,适量的牵引模式”。 乔丹品牌开发的专有编织技术和标准碳纤维并不会有什么不同,但它的大小和形状是有不同的。它提供了适量的刚性,同时还允许脚自然弯曲。参考资料来源:百度百科-aj2023-07-31 20:28:211
retrofit 2.0怎么查看请求的路径和参数
Retrofit是Square Inc.发布在开源社区的一款令人叹为观止的工具。它是一个类型安全的 HTTP 客户端,适用于安卓和 Java 应用。 类型安全 HTTP 客户端主要意味着,你只需关心发送出去的网络请求的语义,而不必考虑 URL 构建的细节2023-07-31 20:28:281
android Retrofit 的post请求方式的参数用换成json么
1. JSON的数据格式a) 按照最简单的形式,可以用下面这样的 JSON 表示名称/值对:{ "firstName": "Brett" }b) 可以创建包含多个名称/值对的记录,比如:{ "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }c) 可以创建值的数组{ "people": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }, { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" }]}d) 当然,可以使用相同的语法表示多个值(每个值包含多个记录):{ "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }, { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" } ],"authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" }, { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" }],"musicians": [ { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" }]}注意,在不同的主条目(programmers、authors 和 musicians)之间,记录中实际的名称/值对可以不一样。JSON 是完全动态的,允许在 JSON 结构的中间改变表示数据的方式。2. 在 JavaScript 中使用 JSONJSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包。 2.1 将 JSON 数据赋值给变量例如,可以创建一个新的 JavaScript 变量,然后将 JSON 格式的数据字符串直接赋值给它:var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }, { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" } ], "authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" }, { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" } ], "musicians": [ { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" } ] }2.2 访问数据将这个数组放进 JavaScript 变量之后,就可以很轻松地访问它。实际上,只需用点号表示法来表示数组元素。所以,要想访问 programmers 列表的第一个条目的姓氏,只需在JavaScript 中使用下面这样的代码:people.programmers[0].lastName;注意,数组索引是从零开始的。2.3 修改 JSON 数据正如访问数据,可以按照同样的方式修改数据:people.musicians[1].lastName = "Rachmaninov";2.4 转换回字符串a) 在 JavaScript 中这种转换也很简单:String newJSONtext = people.toJSONString();b) 可以将任何 JavaScript 对象转换为 JSON 文本。并非只能处理原来用 JSON 字符串赋值的变量。为了对名为 myObject 的对象进行转换,只需执行相同形式的命令:String myObjectInJSON = myObject.toJSONString();说明:将转换回的字符串作为Ajax调用的字符串,完成异步传输。小结:如果要处理大量 JavaScript 对象,那么 JSON 几乎肯定是一个好选择,这样就可以轻松地将数据转换为可以在请求中发送给服务器端程序的格式。3. 服务器端的 JSON3.1 将 JSON 发给服务器a) 通过 GET 以名称/值对发送 JSON在 JSON 数据中会有空格和各种字符,Web 浏览器往往要尝试对其继续编译。要确保这些字符不会在服务器上(或者在将数据发送给服务器的过程中)引起混乱,需要在JavaScript的escape()函数中做如下添加:var url = "organizePeople.php?people=" + escape(people.toJSONString());request.open("GET", url, true);request.onreadystatechange = updatePage;request.send(null);b) 利用 POST 请求发送 JSON 数据当决定使用 POST 请求将 JSON 数据发送给服务器时,并不需要对代码进行大量更改,如下所示:var url = "organizePeople.php?timeStamp=" + new Date().getTime();request.open("POST", url, true);request.onreadystatechange = updatePage;request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");request.send(people.toJSONString());注意:赋值时格式必须是var msg=eval("(" + req.responseText + ")");3.2 在服务器上解释 JSONa) 处理 JSON 的两步骤。 针对编写服务器端程序所用的语言,找到相应的 JSON 解析器/工具箱/帮助器 API。 使用 JSON 解析器/工具箱/帮助器 API 取得来自客户机的请求数据并将数据转变成脚本能理解的东西。 b) 寻找 JSON 解析器寻找 JSON 解析器或工具箱最好的资源是 JSON 站点。如果使用的是 Java servlet,json.org 上的 org.json 包就是个不错的选择。在这种情况下,可以从 JSON Web 站点下载 json.zip 并将其中包含的源文件添加到项目构建目录。编译完这些文件后,一切就就绪了。对于所支持的其他语言,同样可以使用相同的步骤;使用何种语言取决于您对该语言的精通程度,最好使用您所熟悉的语言。c) 使用 JSON 解析器一旦获得了程序可用的资源,剩下的事就是找到合适的方法进行调用。如果在 servlet 中使用的是 org.json 包,则会使用如下代码:public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { StringBuffer jb = new StringBuffer(); String line = null; try { BufferedReader reader = request.getReader(); while ((line = reader.readLine()) != null) jb.append(line); } catch (Exception e) { //report an error } try { JSONObject jsonObject = new JSONObject(jb.toString()); } catch (ParseException e) { // crash and burn throw new IOException("Error parsing JSON request string"); } // Work with the data using methods like... // int someInt = jsonObject.getInt("intParamName"); // String someString = jsonObject.getString("stringParamName"); // JSONObject nestedObj = jsonObject.getJSONObject("nestedObjName"); // JSONArray arr = jsonObject.getJSONArray("arrayParamName"); // etc...}2023-07-31 20:28:361
Retrofit 2中@Path 和@Query的区别
初学thinkphp的时候,很多人都对execute()和query()方法的区别搞不懂,本文就此浅析二者的区别。大家都知道,thinkphp中execute()和query()方法都可以在参数里直接输入sql语句。但是不同的是execute()通常用来执行insert或update等sql语句,而query常用来执行select等语句。 execute()方法将返回影响的记录数,如果执行sql的select语句的话,返回的结果将是表的总记录数:代码如下:$model = m( mytable );$result = $model ->execute( "update mytable set name=aaa where id=11"); //将返回总行数query()方法将返回数据集:代码如下:$model = m( mytable );$result = $model ->query( "select * from mytable" ); //将返回array()2023-07-31 20:28:421
okhttp,retrofit,android-async-http,volley应该选择哪一个
个人认为okhttp是android平台最好的网络库。volley是一个简单的异步http库,仅此而已。缺点是不支持同步,这点会限制开发模式;不能post大数据,所以不适合用来上传文件。android-async-http,与volley一样是异步网络库。但volley是封装的httpUrlConnection,它是封装的httpClient,而android平台不推荐用HttpClient了,所以这个库已经不适合android平台了。okhttp是高性能的http库,支持同步、异步,而且实现了spdy、http2、websocket协议,api很简洁易用,和volley一样实现了http协议的缓存。picasso就是利用okhttp的缓存机制实现其文件缓存,实现的很优雅,很正确,反例就是UIL(universal image loader),自己做的文件缓存,而且不遵守http缓存机制。retrofit与picasso一样都是在okhttp基础之上做的封装,项目中可以直接用了。另外AndroidAsync这个网络库使用了nio的方式实现的。okhttp没有提供nio的方式,不过nio更适合大量连接的情况,对于移动平台有点杀鸡用牛刀的味道。picasso、uil都不支持inbitmap,项目中有用到picasso的富图片应用需要注意这点。2023-07-31 20:28:501
android retrofit上传二进制流 byte[] img
以下是图片上传方式:接口写法:Java code?123 @Multipart @POST("/user/addLicenseInfo") void addLicenseInfo(@QueryMap Map<String, Object> options, @Part("file") TypedFile file, Callback<JsonElement> response);实现写法:Java code?12345 API api = mRegisterActivity.createAPI(); Map<String, Object> options = new HashMap<String, Object>(); options.put("mobile",photoNumber); TypedFile typedImage = new TypedFile(getMIMEType(pictureFile), pictureFile); api.addLicenseInfo(options,typedImage,new Callback<JsonEleme2023-07-31 20:28:571