retrofit

阅读 / 问答 / 标签

retrofit kit 是什么意思

您好,看到您的问题将要被新提的问题从问题列表中挤出,问题无人回答过期后会被扣分并且悬赏分也将被没收!所以我给你提几条建议: 一、您可以选择在正确的分类下去提问或者到与您问题相关专业网站论坛里去看看,这样知道你问题答案的人才会多一些,回答的人也会多些;二、您可以多认识一些知识丰富的网友,和曾经为你解答过问题的网友经常保持联系,遇到问题友询问,他们会更加真诚热心为你寻找答案的; 三、该自己做的事还有的事还是须由自己的聪明才智来解决的,别人不可能代劳!只有自己做了才是真正属于自己的,别人只能给你提供指导和建议,最终靠自己;四、 您可以不采纳我的答案,我的建议哦! 虽然我的答案很可能不能解决你的问题,但一定可以使你更好地使用问问哦~

rxjava+retrofit判断是否有网络

构建我们的model: (在这里我使用到了两个注解,这两个注解在XML中是不能使用的) class DataModel{ @SerializedName("code") @Expose public String code; @SerializedName("data") @Expose public List dataList = new ArrayList(); public stat

retrofit DD lamp 是 啥子灯?

b

okhttp3+rxjava2+retrofit2怎样获取502错误

响应式代码的基本组成部分是Observables和Subscribers(事实上Observer才是最小的构建块,但实践中使用最多的是Subscriber,因为Subscriber才是和Observables的对应的。)。Observable发送消息,而Subscriber则用于消费消息。 RxJava 基本概念 O

retrofit2设置了日志拦截器为什么不打印日志

(1) 在com.geloin.spring.interceptor包中添加SystemInterceptor 并使其继承HandlerInterceptor (2) 修改context-dispatcher.xml,让spring管理拦截器

retrofit一个请求最多多少线程

通笔者所项目都启用 JRebel for Android Android Studio 插件启用基本意味着需点击自定义按钮能运行应用其余所工作都交给JRebel for Android 安卓发者说款提升效率工具,

led retrofit什么意思

  led retrofit的中文翻译  led retrofit  LED改型  双语例句  1  There is a veritable crush of companies seeking to carve out a space in this burgeoning LED retrofit market.  很多公司都全力以赴在新兴的LED改型市场中占据一席之地。  2  A recent Gateway report by the Department of Energy ( DOE) demonstrated substantial energy savings in projects which retrofit their lighting projects with sensor based LED luminaires.  最近美国能源部(DOE)发布的报告显示,在种类众多的照明项目中,以传感器为基础的LED照明设备确实节省了能源。

retrofit 2.0使用post请求可以用path传递参数吗

JSON的数据格式 a) 按照最简单的形式,可以用下面这样的 JSON 表示名称/值对: { "firstName": "Brett" } b) 可以创建包含多个名称/值对的记录

在用Retrofit的Gson解析器遇到的坑

Background concurrent copying GC freed 817417(13MB) AllocSpace objects, 46(1880KB) LOS objects, 12% 这是Json解析错误的打印输出,很可能是你的数据类里包含了Drawable或者其他图形相关的属性

365 体_育retrofit使用时call对象执行不了enqueue是什么问题

Retrofit是Square Inc.发布在开源社区的一款令人叹为观止的工具。它是一个类型安全的 HTTP 客户端,适用于安卓和 Java 应用。

android retrofit 上传进度requestbody writeto 为什么会调用两次

用Retrofit发送网络请求和解析json的实例Retrofit是Android的一个非常好用的开源HTTPRequest。现在介绍一下Retrofit是如何使用的。。。。首先是导入Retrofit包,dependencies{compilefileTree(dir:"libs",include:["*.jar"])compile

android retrofit 2.0怎么post一个map

@FormUrlEncoded@POST("Comments/{newsId}")Call<Comment> reportComment(@Path("newsId") String commentId,@Field("reason") String reason);1234512345需要补全URL,问号后加入access_token,post的数据只有一条reason

如何提高retrofit+okhttp+rxjava的请求速度

定义带泛型的返回结果,Retrofit API 的原生结果映射为这种形式:class Result<T> {String ResultMessage;int ResultCode;T Data;?}

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<JsonEleme

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的富图片应用需要注意这点。

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()

retrofit 2.0怎么查看请求的路径和参数

Retrofit是Square Inc.发布在开源社区的一款令人叹为观止的工具。它是一个类型安全的 HTTP 客户端,适用于安卓和 Java 应用。 类型安全 HTTP 客户端主要意味着,你只需关心发送出去的网络请求的语义,而不必考虑 URL 构建的细节

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:“它的纬向工程实际相匹配的足迹。我们正在寻找一个脚印发现鞋的磨损最初发生地方,适量的牵引模式”。 乔丹品牌开发的专有编织技术和标准碳纤维并不会有什么不同,但它的大小和形状是有不同的。它提供了适量的刚性,同时还允许脚自然弯曲。参考资料来源:百度百科-aj

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 解码,无论如何也得不到正确答案的。

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();

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打印日志等});

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字符串了,在需要的时候可以用这种办法。

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 打印日志等 });

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的注解就可以了。就这么简单。

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。

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 { } 后记:如有不同见解或疑惑,欢迎留言,如果觉得不错可以来个赞!点个赞!

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;}

在Android中使用retrofit时,怎样获取响应的头信息

如何让你的电脑通过安卓手机上网 (本人用的是三星GT-S5830,USB连接方式) 准备工作: 1.下载手机的usb驱动 2.下载PDANet,, 选择Version 2.45 installer for 32-bit Windows 7/Vista/

retrofit2为什么要跟rxjava结合使用

响应式代码的基本组成部分是Observables和Subscribers(事实上Observer才是最小的构建块,但实践中使用最多的是Subscriber,因为Subscriber才是和Observables的对应的。)。Observable发送消息,而Subscriber则用于消费消息。

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)); }}

如何用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()); } });

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的富图片应用需要注意这点。

【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,以对象的形式提交 Tips

在Android中使用retrofit时,怎样获取响应的头信息

获取方法有两种获取Response Headers的方法直接在定义接口是让接口返回Retrofit的Response对象,在Response对象中可以获取到Headers2. 在构建Retrofit的APIService时,在OkHttpClient中加入Interceptor,用以拦截请求和响应获取请求头和响应头。此方法可用于Retrofit2和OKHttp3.Interceptor必须在OkHttpClient构建时加入,OKHttpClient的interceptors()方法返回的是一个不可编辑的列表,

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打印日志等});

如何使用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) {......}});

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则是添加了分隔符等内容的构造体。

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/RetrofitRxJavaException

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 为空. -- END

retrofit怎么设置请求超时时间

通常,笔者在所有项目中都会启用 JRebel for Android。 这是一个 Android Studio 的插件。“启用它”基本上意味着,只需点击一下自定义按钮就能运行应用,其余所有工作都交给它了。JRebel for Android 对安卓开发者来说是一款提升效率的工具,它可。

如何获取retrofit的请求参数

Retrofit是一个非常优秀的网络库,默认支持OkHttp,Retrofit与OkHttp共同出自于Square公司,Retrofit其实就是对OkHttp做了一层封装。把网络请求都交给给了OkHttp,我们只需要通过简单的配置就能使用Retrofit来进行网络请求了。

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 另外还有几点

SpringBoot优雅的http客户端工具(Retrofit)

Retrofit能够支持接口的方式发起http请求,类似于Feign申明式接口调用。 目前,java常用的开发框架是springboot,遗憾的是Retrofit官方并不支持。但是,有位开发者做了增强。 注意:@Field 必须结合@FormUrlEncoded注解一起使用,否则post请求无法接收参数 修改日志策略global-log-strategy:body 响应结果 Retrofit 请求参数支持Map,详细查看官网

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时,会进行一定的装饰

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);  }

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中添加拦截

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设置

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采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

英语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过去分词:remodelled

Retrofit之请求参数

在上文,我们了解了如何定义请求Url,感兴趣的朋友可以参见 《Retrofit之请求Url》 。Retrofit系列持续更新,本文介绍如何使用Retrofit定义请求参数。 请求参数从传递方式可分三种:url参数,请求主体以及表单编码。我们来一一讨论。 url参数就是在url链接后面的键值对,例如 https://api.weibo.com/2//statuses/public_timeline.json?access_token=xxx 中,access_token就是url参数,xxx为其值。 Retrofit定义url参数非常直接,只要在方法参数前面添加@Query("key")注解即可。@Query中key的值与url中的参数名称是一致的,Retrofit会自动添加这些参数到url中。 以之前获取微博公共动态的API为例,具体API详见 http://open.weibo.com/wiki/2/statuses/public_timeline 。从接口中看到,必选参数只有access_token一个,我们定义个方法如下: 方法timelineForPublic需要参数token,Retrofit会通过@Query中定义的名称access_token将token映射成请求参数access_token。此时,请求url就会变成: 从获取微博公共动态的API中我们可以看到,除了必选的access_token,还有三个可选参数count、page以及base_app,也就是说现在请求参数有四个了。有了上面定义请求参数的介绍,我们只需要往方法上添加相应的参数并用@Query进行注解: 此时,如果我们只需要传递access_token,而不需要其他参数,则可以在调用方法的时候传null。当然,我们不能传null给int这样的原生类型,而需要使用对应的Integer。而Retrofit会跳过值为null的参数,并在组装请求的时候忽略它们。 获取公共微博最多有四个参数,那么我们再查看下获取好友微博API http://open.weibo.com/wiki/2/statuses/friends_timeline ,发现其有一个必选参数以及七个可选参数,也就是方法会有八个参数。那么问题来了,如果有更多的可选参数,那方法的参数是不是也会特别多,而且很多时候我们只需要其中一两个请求参数,却需要提供所有的参数值,显然很繁琐。为了处理这种情况,QueryMap就该登场了。 我们可以使用下面的方式定义获取公共微博API的方法: @QueryMap后面需要紧跟着一个Map< String, String >类型,这样就可以动态地添加查询参数了。如果说只需要accept_token参数,则可以像下面这样调用: 这样,我们只需要传递我们需要设置的参数就可以了。 在我们查看微博的各个API时,会发现每个请求都需要一个access_token参数,于是我们就在所有的方法中都添加了对应的参数。那么有没有简单的方式来给每个请求都添加相同的参数,从而不需要每个请求都做相同处理呢? 强大的Retrofit是支持的,但是是通过OkHttp中的拦截器来实现的。我们在 《Retrofit之初体验》 提及过,Retrofit直接依赖OkHttp,使用OkHttp作为底层网络客户端。而使用OkHttp可以添加拦截器,用来修改即将发出去的请求,这个可以参见 《OkHttp之拦截器》 。这样我们就可以在拦截器中,对每个请求添加一个access_token参数了: 首先获取到了HttpUrl对象,然后基于原始的HttpUrl对象创建一个新的构建器,从而可以使用addQueryPatameter()方法添加额外的查询参数,最后将这个新的HttpUrl对象通过Request.Builder方法设置到Request中。 在我们实际应用中,大多数时候会通过请求主体向服务器发送数据。以我们的惯例,都会以微博API为例,但可惜的是并没有找过微博使用这种方式的API,而都使用的是表单方式,这个会在后面讨论。所以个很常见的例子,那就是登陆,通常请求参数如下: 好的,登录的方法定义如下: 其中LoginParam.java类如下: 首先,我们使用了@Body注解了方法参数,而我们在创建Retrofit.Builder的时候也为其添加了GsonConverter转换器。 这样,Retrofit会将LoginParam对象转换为Json,并将其作为主体数据添加到请求中,支持了使用请求主体向服务器发送数据。 在上面我们使用了用请求主体的方式来向服务器发送数据,除了这种方式,还可以通过表单编码(form-urlencoded)的形式。微博API中的写入接口都是采用这种方式向服务器发送数据的,我们这里以转发微博为例,具体API详见 http://open.weibo.com/wiki/2/statuses/repost 。 首先,定义转发微博的方法: 我们看到了@FormUrlEncoded注解,这个注解不能使用在GET请求上,因为它代表要想服务器发送数据。此外,在参数id上使用@Field注解,表示请求会发送此参数到服务器,而@Field("id")中的id则定义的是参数名称。 与@Query类似,当你有多个参数要发送时,只需要使用@Field注解它们即可。同样与@QueryMap对应的有个@FieldMap注解,具体使用类似。 @Field与@FieldMap都有一个属性encoded,表示键值对是否进行url编码,默认为false。以@Field为例,使用如下: 了解完@Field之后,我们讨论下表单编码与url参数的区别:表单编码使用在POST请求中的,而url参数是用在GET请求中的。表单编码使用请求主体发送数据到服务器,而不是url参数。而url参数的使用主要是为了从服务器过滤或者获取指定的数据。 Ok,本文就讨论到这里,感谢大家的阅读,下文我们将讨论Retrofit如何定义请求头。 如果你对retrofit感兴趣,同时你也觉得我的文章可以给你带来那么一丢丢的帮助,敬请关注,后续会继续介绍Retrofit的相关使用。 源码地址: https://github.com/FILWAndroid/DevJourney 关于源码:

如何用 Retrofit 2 在安卓上实现 HTTP 访问

Retrofit是Square Inc.发布在开源社区的一款令人叹为观止的工具。它是一个类型安全的 HTTP 客户端,适用于安卓和 Java 应用。类型安全 HTTP 客户端主要意味着,你只需关心发送出去的网络请求的语义,而不必考虑 URL 构建的细节,以及参数设定是否正确之类的事。Retrofit应对这些易如反掌,你只需写几个接口即可。就是这么简单!我们通过一个例子来看看它是怎么实现的。笔者已经把这里所有的代码都放在了 Github 的 资源库里。如你所知,最好的学习方法就是查看这些代码,自己调试调试。首先,笔者在 Android Studio 里建了一个空项目。老实说,每次看到欢迎界面上出现的那堆有关兼容性、以及应用所支持的 API 的选项,笔者都会感到非常迷茫。好在我们只是弄个“玩具”项目而已,因此我们可以大胆地选择最新的 SDK,然后快速掠过项目向导,进入我们伟大的「hello world」安卓应用。如果你自己不想纠结这些选项,可以直接点击这个 Github 的链接,导入笔者提交的现成项目:Floating button app skeleton.通常,笔者在所有项目中都会启用 JRebel for Android。这是一个 Android Studio 的插件。“启用它”基本上意味着,只需点击一下自定义按钮就能运行应用,其余所有工作都交给它了。JRebel for Android 对安卓开发者来说是一款提升效率的工具,它可以在运行着的设备和模拟器上即时更新代码。这本质上意味着在开发应用时,你不必浪费宝贵的时间来等待应用重启,并因此而中途放弃这些应用的状态记录。总之特别棒!说明一下,我在 ZeoTurnaround 公司工作,也就是创造JRebel for Android的公司。但它真的很好用,你值得一试。Android Studio 2.0附带的新模拟器用着也很爽。现在,MainActivity 类的模拟器屏幕被激活了。点一下浮动按钮,出现 snackbar。看起来不错。让我们随意更改一段代码,检验一下代码重新加载的功能。笔者首先想到的是修改 snackbar 的字符串值。FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, “Super fast hello world”, Snackbar.LENGTH_LONG) .setAction(“Action”, null).show(); }});注意看,我们保存了一个文件,点击了一下按钮,接着模拟器上的代码就重新加载了。现在一切就绪!也就是说,我们可以研究 Retrofit 2 到底有什么用处了。Retrofit 2 是一个类型安全的 HTTP 客户端,适用于安卓(及 Java)。但首先,它也是一个库。所以我们要先声明依赖。这个容易。不过,请注意,我们需要显式依赖gson 转换器,将 JSON 应答转换为 model 类。这与Retrofit 1不同。所以需要注意一下。Add these two lines to the build.gradle file:将这两行代码加到 build.gradle 文件中去:compile ‘com.squareup.retrofit2:retrofit:2.0.0-beta2"compile ‘com.squareup.retrofit2:gson-converter:2.0.0-beta2"Retrofit 的主要功能是可以在运行时生成代码,发送 HTTP服务查询请求。开发者只需写一个“说明”接口即可。假设我们有如下的一个 model 类:通过这个我们可以创建一个名为GithubService的接口,用于实现 HTTP 通信。public interface GitHubService { @GET(“repos/{owner}/{repo}/contributors”) Call<List<Contributor>> repoContributors( @Path(“owner”) String owner, @Path(“repo”) String repo);}This is the simplest example, we add the @GET annotation on an interface method and provide the path part of the URL that we want to expose it on. Conveniently, the method parameters can be referenced in the path string so you won"t need to jump through hoops to set those. Additionally, with other annotations you can specify query parameters, POST request body and so on:@Query(“key”)u200a—u200afor GET request query parameter@QueryMapu200a—u200afor the map of parameters@Bodyu200a—u200ause it with the @POST annotation to provide the query body content.这是一个最简单的例子。我们在接口方法中加入 @GET 注解,并且提供想要展示的 URL 的path部分。方便的是,由于可以在 path 字符串中引用方法参数,因此我们无需跳出循环再重新设定。另外,通过这些注解,你可以设定查询参数,以及 POST 请求主体等等:@Query(“key”)u200a -- 用于GET请求查询参数@QueryMap -- 用于参数映射@Body -- 与@POST注解一起使用,提供查询主体内容下面,为了能在运行时使用这个接口,我们需要构建一个 Retrofit 对象:interface GitHubService { @GET("repos/{owner}/{repo}/contributors") Call<List<Contributor>> repoContributors( @Path("owner") String owner, @Path("repo") String repo);public static final Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .addConverterFactory(GsonConverterFactory.create()) .build();}笔者倾向于在包含网站请求的接口内使用 Retrofit builder。这么做并不是想让它变得复杂难懂。而是处于通用配置的考虑。例如,我们有默认的转换器,将 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);Call<List<Contributor>> call = gitHubService.repoContributors(“square”, “retrofit”);List<Contributor> result = call.execute().body();另外,有人可能也会选择设定请求的时间,让它成为异步请求,同时在执行完毕后提供 callback。call.enqueue(new Callback<List<Contributor>>() { @Override public void onResponse(Response<List<Contributor>> response, Retrofit retrofit) { // handle success } @Override public void onFailure(Throwable t) { // handle failure }});听起来超简单!我们来处理一下 UI,然后写入代码。在浮动按钮的应用模板下,我们需要修改 content_main.xml 文件。笔者添加了一个发起请求查询的按钮,以及一个用以显示请求结果的文本区域:<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Fetch" android:id="@+id/button" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="151dp" /><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="" android:id="@+id/textView" android:layout_above="@+id/button" android:layout_alignParentEnd="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:textIsSelectable="false" />第一次执行时,你的网络请求代码看起来可能是这样的:Button button = (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class); Call<List<Contributor>> call = gitHubService.repoContributors(“square”, “retrofit”); String result = call.execute().body().toString(); TextView textView = (TextView) findViewById(R.id.textView); textView.setText(result); }});这段代码自然无法运行。安卓框架不允许用户在 UI 线程中执行网络请求。UI 线程只应该用来处理一些用户输入。在这个线程中执行任何引起长时间阻塞的操作都会让用户体验变得非常糟糕。因此,我们需要重构这段代码,把网络请求移入后台线程。使用 JRebel for Android 可以不费任何时间就搞定这事。我们将代码提取到 AsyncTask -- 这是一个在安卓上运行大型运算的默认框架。AsyncTask不太好看,它的具体运行方式也不算清洁,例如每次我们点击按钮时它都会去创建一个 Retrofit 对象。但是能用就行。private class NetworkCall extends AsyncTask<Call, Void, String> { @Override protected String doInBackground(Call… params) { try { Call<List<Contributor>> call = params[0]; Response<List<Contributor>> response = call.execute(); return response.body().toString(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { final TextView textView = (TextView) findViewById(R.id.textView); textView.setText(result); }}接着,从 EventListener 中调用它:Button button = (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class); final Call<List<Contributor>> call = gitHubService.repoContributors("square", "retrofit"); new NetworkCall().execute(call); }});好啦,现在代码可以运行了。文本视图会根据 HTTP 请求的结果实时刷新。