Retrofit 2.0 使用总结
2017-07-16 23:27
399 查看
这天,leader给了我一张图,然后让我调试后台接口,图片如下:
![](http://img.blog.csdn.net/20170716205028095?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVmljZW50Xzk5MjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
我看这么简单,然后直接用浏览器测试了一下,然后返回图片如下:
![](http://img.blog.csdn.net/20170717114259072?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVmljZW50Xzk5MjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
然后花了一个下午时间测试,终于把接口调通了,但是居然解析不了其中的返回内容,,,,于是,在礼拜天我就花时间来研究了一下关于接口的开发!
本来我打算随便写一个 Java 类,然后用tomcat就可以测试后台了,但是我不知道如何实现上图的禁止get请求,于是问了一下这方面的大神:
我用spring mvc的时候,controler的requestmapping的method 的值设为post就会无视get请求
由于上面的知识点我都不会,于是我自动忽略了自己写后台的想法,接着打算在网上找一个可以测试后台的网站,结果找到一个 http://www.ouapi.com/ ,但是打开页面以后也不知道如何设置后台,后来询问大神得知——人家一般使用的是 postman 这个插件,于是我按照网上的介绍,赶紧安装了一个!测试了一下,还真的很好用,以图为证:
![](http://img.blog.csdn.net/20170716211557114?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVmljZW50Xzk5MjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
废话说了这么多,接下来开始干正事!介绍一下自己使用 Retrofit 2.0 的一些总结。第一步,肯定是得导包,这个随便百度一下 Retrofit 2.0 就可以翻出来了,
第二步就是实例化 retrofit ,这个基本上也是可以直接从网上复制下来就可以用
接下来就是关于各种网络请求的封装了,比如我们先请求一段本地的文件,测试一下 get 请求,简单来说我们的第三步需要如下步骤:
建立 interface ,并封装 get 请求
通过上面实例化的 Retrofit 对象,实例化上面的 interface 对象
调用上述封装的 get 请求
通过上面的步骤,大概知道做什么以后,那么我们通过 postman 来测试一下这个接口:
![](http://img.blog.csdn.net/20170716212701592?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVmljZW50Xzk5MjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
当然,大家也可以通过post来测试这个接口,待会我们就可以来测试,现在开始来执行上面的第一步——建立 interface ,并封装 get 请求:
这里说一下 @GET(“getdata.gson”) 这里为什么会跟一个文件呢?因为上面说过,
设置baseUrl,必须是以“/”结尾(重要的事情只说一边!)
所以我们现在带着上面的提醒来执行第二步——通过上面实例化的 Retrofit 对象,实例化上面的 interface 对象:
上面的 RetrofitLoader 应该做一个单例,这里只是测试,下来后慢慢完善!接下来就是第三步——调用上述封装的 get 请求:
接下来我们看看日志:
这里说明一个问题:在线程里面开子线程请求网络(线程 ID :1248 ),然后异步返回的线程不是在当前所在的子线程,而是在主线程,至于网络请求的同步,这个就不记录测试了,其实我最想测试的是 Post 请求,而且是带参数的,因为工作中需要用到,但是在测试过程中发生问题了!
在讲问题之前先看看API吧,如图:
![](http://img.blog.csdn.net/20170716220317637?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVmljZW50Xzk5MjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
接下来我们先封装一个 Post 请求,不过这里不需要单独新建 interface 对象了,
接下来我们看看调用过程中是不是有传说的异常?
![](http://img.blog.csdn.net/20170716231205930?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVmljZW50Xzk5MjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
访问成功了?那么我们继续来看看访问不成功,只要将post方法修改一下,这个方法就运行不起来:
![](http://img.blog.csdn.net/20170716231555345?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVmljZW50Xzk5MjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
虽然 Body 标签完成了访问,但是返回码是 1001,返回码是 key 值错误,但是这个值我确定没有复制错,具体是怎么回事呢?看看日志:
![](http://img.blog.csdn.net/20170716232109302?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVmljZW50Xzk5MjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
对 http 来说参数之间的分割只有一种 & ,这里的,是错误的,所以服务端报错,那么这里该如何修改呢?
接下来我们再继续观察一下日志:
OK,明天可以给领导交差了!!!
我看这么简单,然后直接用浏览器测试了一下,然后返回图片如下:
然后花了一个下午时间测试,终于把接口调通了,但是居然解析不了其中的返回内容,,,,于是,在礼拜天我就花时间来研究了一下关于接口的开发!
本来我打算随便写一个 Java 类,然后用tomcat就可以测试后台了,但是我不知道如何实现上图的禁止get请求,于是问了一下这方面的大神:
我用spring mvc的时候,controler的requestmapping的method 的值设为post就会无视get请求
由于上面的知识点我都不会,于是我自动忽略了自己写后台的想法,接着打算在网上找一个可以测试后台的网站,结果找到一个 http://www.ouapi.com/ ,但是打开页面以后也不知道如何设置后台,后来询问大神得知——人家一般使用的是 postman 这个插件,于是我按照网上的介绍,赶紧安装了一个!测试了一下,还真的很好用,以图为证:
废话说了这么多,接下来开始干正事!介绍一下自己使用 Retrofit 2.0 的一些总结。第一步,肯定是得导包,这个随便百度一下 Retrofit 2.0 就可以翻出来了,
compile 'com.squareup.retrofit2:retrofit:2.0.2' //retrofit:2.0 compile 'com.squareup.retrofit2:converter-gson:2.0.2' //retrofit:2.0封装下的gson compile 'com.squareup.okhttp3:logging-interceptor:3.2.0' //retrofit:2.0下的okhttp3的请求日志
第二步就是实例化 retrofit ,这个基本上也是可以直接从网上复制下来就可以用
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .retryOnConnectionFailure(true) .connectTimeout(15, TimeUnit.SECONDS) .addNetworkInterceptor(interceptor) .build(); Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") .create(); //获取实例 Retrofit retrofit = new Retrofit.Builder() //设置OKHttpClient,如果不设置会提供一个默认的 .client(client) //设置baseUrl,必须是以“/”结尾 .baseUrl(url) //添加Gson转换器 .addConverterFactory(GsonConverterFactory.create(gson)) .build();
接下来就是关于各种网络请求的封装了,比如我们先请求一段本地的文件,测试一下 get 请求,简单来说我们的第三步需要如下步骤:
建立 interface ,并封装 get 请求
通过上面实例化的 Retrofit 对象,实例化上面的 interface 对象
调用上述封装的 get 请求
通过上面的步骤,大概知道做什么以后,那么我们通过 postman 来测试一下这个接口:
当然,大家也可以通过post来测试这个接口,待会我们就可以来测试,现在开始来执行上面的第一步——建立 interface ,并封装 get 请求:
public interface RetrofitInterface { @GET("getdata.gson") Call<Password> getPassWord(); }
这里说一下 @GET(“getdata.gson”) 这里为什么会跟一个文件呢?因为上面说过,
设置baseUrl,必须是以“/”结尾(重要的事情只说一边!)
所以我们现在带着上面的提醒来执行第二步——通过上面实例化的 Retrofit 对象,实例化上面的 interface 对象:
/** * Retrofit实体类 * Created by asus on 2017/7/15. */ public class RetrofitLoader { private RetrofitInterface service; public RetrofitLoader(String url){ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .retryOnConnectionFailure(true) .connectTimeout(15, TimeUnit.SECONDS) .addNetworkInterceptor(interceptor) .build(); Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") .create(); //获取实例 Retrofit retrofit = new Retrofit.Builder() //设置OKHttpClient,如果不设置会提供一个默认的 .client(client) //设置baseUrl,必须是以“/”结尾 .baseUrl(url) //添加Gson转换器 .addConverterFactory(GsonConverterFactory.create(gson)) .build(); service = retrofit.create(RetrofitInterface.class); } public void getPassWord(Callback<Password> callback){ Call<Password> call = service.getPassWord(); //异步请求 call.enqueue(callback); //同步请求 //1call.execute(); } }
上面的 RetrofitLoader 应该做一个单例,这里只是测试,下来后慢慢完善!接下来就是第三步——调用上述封装的 get 请求:
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView textView = (TextView) findViewById(R.id.textview); Thread thread = Thread.currentThread(); Log.e(TAG, "onCreate: "+ thread.getId()); new Thread(){ @Override public void run() { super.run(); Thread thread = Thread.currentThread(); Log.e(TAG, "run1: "+ thread.getId()); new RetrofitLoader("http://192.168.199.237:8080/examples/").getPassWord(new Callback<Password>() { @Override public void onResponse(Call<Password> call,final Response<Password> response) { textView.setText(response.body().getData()); Thread thread = Thread.currentThread(); Log.e(TAG, "onResponse: "+ thread.getId()); textView.post(new Runnable() { @Override public void run() { Thread thread = Thread.currentThread(); Log.e(TAG, "run2: "+ thread.getId()); } }); } @Override public void onFailure(Call<Password> call, Throwable t) { Log.e(TAG, "onFailure: ",t ); } }); } }.start(); } }
接下来我们看看日志:
07-16 21:52:35.837 9174-9174/? E/MainActivity: onCreate: 1 07-16 21:52:35.838 9174-9195/? E/MainActivity: run1: 1248 07-16 21:52:36.076 9174-9174/? E/MainActivity: onResponse: 1 07-16 21:52:36.076 9174-9174/? E/MainActivity: onResponse: 7B7F25D86267923209A11145A4EBB34 07-16 21:52:36.086 9174-9174/? E/MainActivity: run2: 1
这里说明一个问题:在线程里面开子线程请求网络(线程 ID :1248 ),然后异步返回的线程不是在当前所在的子线程,而是在主线程,至于网络请求的同步,这个就不记录测试了,其实我最想测试的是 Post 请求,而且是带参数的,因为工作中需要用到,但是在测试过程中发生问题了!
在讲问题之前先看看API吧,如图:
接下来我们先封装一个 Post 请求,不过这里不需要单独新建 interface 对象了,
/** * Created by asus on 2017/7/15. */ public interface RetrofitInterface { @GET("getdata.gson") Call<Password> getPassWord(); @POST("LookUp") Call<IdCardResult> checkIdCard(@Body IdCardInfo cardInfo); } /** * Retrofit实体类 * Created by asus on 2017/7/15. */ public class RetrofitLoader { private RetrofitInterface service; public RetrofitLoader(String url){ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .retryOnConnectionFailure(true) .connectTimeout(15, TimeUnit.SECONDS) .addNetworkInterceptor(interceptor) .build(); Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") .create(); //获取实例 Retrofit retrofit = new Retrofit.Builder() //设置OKHttpClient,如果不设置会提供一个默认的 .client(client) //设置baseUrl,必须是以“/”结尾 .baseUrl(url) //添加Gson转换器 .addConverterFactory(GsonConverterFactory.create(gson)) .build(); service = retrofit.create(RetrofitInterface.class); } public void getPassWord(Callback<Password> callback){ Call<Password> call = service.getPassWord(); //异步请求 call.enqueue(callback); //同步请求 //1call.execute(); } public void checkIdCard(IdCardInfo cardInfo, Callback<IdCardResult> callback){ service.checkIdCard(cardInfo).enqueue(callback); } }
接下来我们看看调用过程中是不是有传说的异常?
访问成功了?那么我们继续来看看访问不成功,只要将post方法修改一下,这个方法就运行不起来:
Call<Response> checkIdCard(@Body IdCardInfo cardInfo);
虽然 Body 标签完成了访问,但是返回码是 1001,返回码是 key 值错误,但是这个值我确定没有复制错,具体是怎么回事呢?看看日志:
对 http 来说参数之间的分割只有一种 & ,这里的,是错误的,所以服务端报错,那么这里该如何修改呢?
@FormUrlEncoded @POST("LookUp") Call<IdCardResult> checkIdCard(@FieldMap Map<String, String> infos); public void checkIdCard(IdCardInfo cardInfo, Callback<IdCardResult> callback){ Map<String, String> infos = new HashMap<>(); infos.put("id",cardInfo.getId()); infos.put("key",cardInfo.getKey()); service.checkIdCard(infos).enqueue(callback); }
接下来我们再继续观察一下日志:
07-16 23:25:18.385 19518-19555/? E/MainActivity: log: --> POST http://api.avatardata.cn/IdCard/LookUp http/1.1 07-16 23:25:18.385 19518-19555/? E/MainActivity: log: Content-Type: application/x-www-form-urlencoded 07-16 23:25:18.386 19518-19555/? E/MainActivity: log: Content-Length: 58 07-16 23:25:18.387 19518-19555/? E/MainActivity: log: 07-16 23:25:18.387 19518-19555/? E/MainActivity: log: id=510921199103210310&key=af43ed19e5524c55a7bdb33d7f16bc5f 07-16 23:25:18.387 19518-19555/? E/MainActivity: log: --> END POST (58-byte body) 07-16 23:25:18.819 19518-19555/? E/MainActivity: log: <-- 200 OK http://api.avatardata.cn/IdCard/LookUp (432ms) 07-16 23:25:18.819 19518-19555/? E/MainActivity: log: Cache-Control: private 07-16 23:25:18.819 19518-19555/? E/MainActivity: log: Content-Length: 110 07-16 23:25:18.820 19518-19555/? E/MainActivity: log: Content-Type: application/json; charset=utf-8 07-16 23:25:18.820 19518-19555/? E/MainActivity: log: Server: Microsoft-IIS/7.5 07-16 23:25:18.820 19518-19555/? E/MainActivity: log: X-AspNet-Version: 4.0.30319 07-16 23:25:18.820 19518-19555/? E/MainActivity: log: X-Powered-By: ASP.NET 07-16 23:25:18.820 19518-19555/? E/MainActivity: log: Date: Sun, 16 Jul 2017 15:25:19 GMT 07-16 23:25:18.820 19518-19555/? E/MainActivity: log: OkHttp-Sent-Millis: 1500218718478 07-16 23:25:18.820 19518-19555/? E/MainActivity: log: OkHttp-Received-Millis: 1500218718818 07-16 23:25:18.821 19518-19555/? E/MainActivity: log: 07-16 23:25:18.821 19518-19555/? E/MainActivity: log: {"result":{"address":"四川省蓬溪县","sex":"M","birthday":"1991-03-21"},"error_code":0,"reason":"Succes"} 07-16 23:25:18.821 19518-19555/? E/MainActivity: log: <-- END HTTP (110-byte body) 07-16 23:25:18.830 19518-19518/? E/MainActivity: onResponse: 0
OK,明天可以给领导交差了!!!
相关文章推荐
- Retrofit2.0使用总结
- Retrofit2.0使用总结及注意事项
- 天气预报项目学习总结(- ButterKnife - Retrofit 2.0(okhttp) - Rxjava - Jackson - Ormlite - Mosby简单使用总结)
- Retrofit2.0 简单使用总结
- Retrofit2.0使用总结
- Android 网络请求框架 Retrofit2.0实践使用总结
- Retrofit2.0使用总结
- Retrofit2.0使用总结
- Retrofit2.0使用总结及注意事项
- Retrofit2.0的使用总结
- Retrofit2.0简单使用总结
- Retrofit2.0使用总结及注意事项
- Retrofit2.0使用总结及注意事项
- Retrofit2.0使用总结及注意事项
- Retrofit2.0使用总结
- retrofit2.0中使用okHTTP post get put 过滤请求内容或添加内容
- Android 仿照微信发说说,既能实现拍照,选图库,多图案上传 使用Retrofit2.0技术
- Retrofit 2.0使用详解,配合OkHttp、Gson,Android最强网络请求框架
- Android 仿照微信发说说,既能实现拍照,选图库,多图案上传 使用Retrofit2.0技术
- Retrofit三步理解之一 ------------------ Retrofit的简单使用总结