Android学习笔记:OkHttp

原文:https://blog.csdn.net/MaybeForever/article/details/87868593

OkHttp的Github地址https://github.com/square/okhttp

在Android Studio中使用不需要下载jar包,直接添加依赖即可:

compile 'com.squareup.okhttp3:okhttp:3.13.1'
添加上述依赖会自动下载两个库,一个是OkHttp库,一个是Okio库,后者是前者的通讯基础。

添加权限:<uses-permission android:name="android.permission.INTERNET"/>


同步请求:执行请求的操作时阻塞式,直到HTTP响应返回。
(OKHttp的execute方法是同步方法)

异步请求:类似于非阻塞式请求,它的执行结果一般都是通过接口回调的方式告知调用者。
(OkHttp的enqueue方法是异步方法)

常用的方法主要有两个:GET和POST。GET表示希望从服务器那里获取数据,而POST则表示希望提交数据给服务器。

一、同步请求-GET

// 创建一个OkHttpClient的实例
OKHttpClient client = new OKHttpClient();
//想要发起一条HTTP请求,就需要创建一个Request对象,可以在最终的build()之前连缀很多其他方法来丰富这个Request对象
Request request = new Request.Builder()
    .url("http://www.baidu.com")
    .build();
//调用OkHttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据
//response对象就是服务器返回的数据
Response response = client,newCall(request).execute();
//得到返回的具体内容
String responseData = response.body().string();

二、异步请求-GET

OKHttpClient ckient = new OKHttpClient();
Request request = new Reqyest.Builder()    
    .url("http://www.baidu.com")
    .build();
Response response = client.newCall(request);
response.enqueue(new Callback(){
    @Override
    public void onFailure(Call call, IOException e){
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException{
        String responseData = response.body().string();
        Log.d(TAG, str);
    }
});

三、同步请求-POST

//创建一个OKHttpClient实例
OKHttpClient client = new OKHttpClient();
//如果要发起Post请求,则需要先构建一个RequestBody对象存放待提交的参数
RequestBody requestBody = new FromBody.Builder()
    .add("username", "admin")
    .add("password", "123456")
    .build();
//然后在Request.Builder中调用一下post()方法,并将RequestBody对象传入
Request request = new Request.Builder()
    .url("http://www.baidu.com")
    .post(requestBody)
    .build();
//调用execute()方法来发送请求并获取服务器返回的数据
Response response = client.newCall(request).execute();
//得到返回的具体内容
String responseData = response.body().string();

四、异步请求-POST

OKHttpClient client = new OKHttpClient();
RequestBody requestBody = new FromBody.Builder()
    .add("username", "admin")
    .add("password", "123456")
    .build();
Request request = new Request.Builder()
    .url("http://www.baidu.com")
    .post(requestBody)
    .build();
Response response = client.newCall(request);
response.enqueue(new Callback(){
    @Override
     public void onFailure(Call call, IOException e){
     }
     @Override
     public void onResponse(Call call, Response response) throws IOException{
          String responseData = response.body().string();
          Log.d(TAG, str);
     }
});

注意:
在以上四段代码中,response.body().string()只能被调用一次,调用一次之后就会被释放,再次调用会爆:java.lang.IllegalStateException:closed
原因:调用一次之后它的内存就释放了
解决方法:可以把它赋值给一个String变量,然后多次使用!!

五、OkHttp的请求流程图


猜你喜欢

转载自blog.csdn.net/NewActivity/article/details/87984075