面试题记录第十节——(okhttp、retrofit网络框架)
来源:互联网 发布:java线程对象锁 编辑:程序博客网 时间:2024/06/04 18:33
问:一、okhttp使用流程
答:1、添加权限,2创建流程
添加权限
配置Okhttp3非常简单,只需要在Android Studio 的gradle进行如下的配置:创建流程
1、创建一个OkhttpClient对象2、创建一个Request对象,通过内部类Builder调用生产Response对象。3、创建一个Call对象,调用execute(同步)/enqueue(异步)方法。private void datas() { //get同步方法 OkHttpClient okc = new OkHttpClient(); Request reqt = new Request.Builder().url("https://github.com/hongyangAndroid").build(); try { Response response = okc.newCall(reqt).execute(); if (response.isSuccessful()){ Log.i("Text","4444444444444444"+response.body().toString()); Headers responseHeaders = response.headers(); for (int i=0;i<responseHeaders.size();i++){ Log.i("Text","5555555555555555"+responseHeaders.name(i)+"---:"+responseHeaders.value(i)); } }else { Log.i("Text","5555555555555555"+response.toString()); } } catch (IOException e) { e.printStackTrace(); } } private void datadata() { //get异步请求方法 OkHttpClient client = new OkHttpClient(); Request reqest = new Request.Builder().url("https://github.com/hongyangAndroid").build(); Call call = client.newCall(reqest); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.i("Text","2222222222222222"+e); } @Override public void onResponse(Call call, Response response) throws IOException { Log.i("Text","3333333333333333333"+response); } }); }
二、问:okhttp关于返回值需要注意几点
如果希望返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()
三、问:okhttp和0khttp3的区别需要注意几点
答:
1、setCookieHandler替换为Builder的cookieJar方法
2、cookie的设置方式不同,:okhttp:okhttp调用OkHttpClient的setCookieHandler方法,CookieHandler是Android SDK提供的标注的cookie管理,CookieHandler 的之类CookieManager实现了cookie的具体管理方法,构建CookieManager需要实现CookieStore接口,系统提供了一个默认的实现CookieStoreImpl,只负责把cookie存储在内存中。
okhttp3:中已经没有setCookieHandler方法了,而改成了cookieJar,新增了Builder,用Builder构建okhttp,设置cookie在Builder的cookieJar方法中设置
3、Call和Callback不同
okhttp的callback方法是 void onFailure(Request request, IOException e);void onResponse(Response response) throws IOException; okhttp3 的Callback方法有void onFailure(Call call, IOException e);void onResponse(Call call, Response response) throws IOException;okhttp3对Call做了更简洁的封装,okhttp3 Call是个接口,okhttp的call是个普通class,一定要注意,无论哪个版本,call都不能执行多次,多次执行需要重新创建。
4、MultipartBuilder已被升级成MultipartBody,MultipartBody.Part和MultipartBody.Builder.
5、okhttp3已经没有了FormEncodingBuilder,可以用下面这个类代替它:FormBody.Builder
四、问:retrofit网络框架使用
答:分三步
推荐博客:http://www.jianshu.com/p/308f3c54abdd一、retrofit使用简介(retrofit底层也是用的Okhttp)第一步:在retrofit中通过一个接口作为http请求的api接口public interface BlogService{ @GET("blog/{id}") //这里的{id} 表示是一个变量 Call<ResponseBody> getBlog(@Path("id") int id);/** 这里的id表示的是上面的{id} */}第二步:创建一个Retrofit实例Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://localhost:4567/") .build();注: Retrofit2 的baseUlr 必须以 /(斜线) 结束,不然会抛出一个IllegalArgumentException,所以如果你看到别的教程没有以 / 结束,那么多半是直接从Retrofit 1.X 照搬过来的。第三部:调用api接口 BlogService service = retrofit.create(BlogService.class); Call<ResponseBody> call = service.getBlog(2); // 用法和OkHttp的call如出一辙 // 不同的是如果是Android系统回调方法执行在主线程 call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse( Call<ResponseBody> call, Response<ResponseBody> response) { try { System.out.println(response.body().string()); } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { t.printStackTrace(); } });
- 完整代码
import java.io.IOException;import okhttp3.ResponseBody;import retrofit2.Call;import retrofit2.Callback;import retrofit2.Response;import retrofit2.Retrofit;import retrofit2.http.GET;import retrofit2.http.Path;/** * [Retrofit入门]源码 */public class Example01 { public interface BlogService { @GET("blog/{id}") //这里的{id} 表示是一个变量 Call<ResponseBody> getBlog(@Path("id") int id);// 这里的id表示的是上面的{id} } public static void main(String[] args) throws IOException { Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://localhost:4567/") .build(); BlogService service = retrofit.create(BlogService.class); Call<ResponseBody> call = service.getBlog(2); // 用法和OkHttp的call如出一辙 // 不同的是如果是Android系统回调方法执行在主线程 call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse( Call<ResponseBody> call, Response<ResponseBody> response) { try { System.out.println(response.body().string()); } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { t.printStackTrace(); } }); }}
- 面试题记录第十节——(okhttp、retrofit网络框架)
- 网络框架-retrofit,okhttp
- 面试题记录第七节——(事件分发)
- Retrofit+okhttp网络框架介绍
- Retrofit+okhttp网络框架介绍
- Retrofit+okhttp网络框架请求
- 笔试面试题记录(0x01) —— #define
- 面试题记录第一节——(activity、fragment)
- 面试题记录第二节——(service、Broadcast)
- 面试题记录第二节——(Binder)
- 面试题记录第五节——Asynctask
- Android网络框架选择(Volley、OkHttp、Retrofit)
- Android网络框架选择(Volley、OkHttp、Retrofit)
- 笔试面试题记录
- 面试题记录
- java 面试题记录
- 笔试面试题记录
- 笔试/面试题记录
- JSP入门知识点解析之九大内置对象
- Android:正则表达式-android固话(座机)的验证
- linux定时执行sh文件
- 同一页面多个swiper出现错乱问题
- mysql分库
- 面试题记录第十节——(okhttp、retrofit网络框架)
- Intelligent.Light.FieldView.v15.Linux64 1CD
- Jedis客户端操作redis缓存命令详解
- HTTPS 与 HTTP 介绍
- MYSQL修改root用户名
- eclipse如何导出WAR包
- android之recyclerView篇
- MySQL优化
- 从经典部署模型迁移到 Azure Resource Manager 部署模型的过程中出现的常见错误