面试题记录第十节——(okhttp、retrofit网络框架)

问:一、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();
            }
        });
    }
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值