基于Okhttp的网络通信的初步认识

基于Okhttp的网络通信的初步认识

OkHttp

在Android开发中,有多种网络通信的方式,包括且不限于:HttpUrlConnection,Android-Async-Http, Volley,Okhttp等.其中,Okhttp因为其接口简单易用,在底层实现上也自成一派,受到广大开发人员的欢迎.
Okhttp是由Square公司开发的,该公司同时还有Retrofit.

使用OkHttp

在使用Okhttp前我们需要在build.gradle文件中添加依赖.

dependencies{
	implementation("com.squareup.okhttp3:okhttp:4.0.1")//4.0.1是目前的最新版本,2019年8月3日.
}

在添加完依赖后resync一下就可以使用了.
Okhttp的使用十分简单

OkhttpClient client = new OkhttpClient();//创建一个Okhttp的实例
Request request = new Request
			.url("http://www.baidu.com")//通过url()方法设置目标的网络地址
			.build();					//完成Request创建
Response response = client.newCall(request).excecute();
										//通过Client的newCall()创建一个call对象,并通过execute()方法发送请求并返回数据
										//execute()方法是同步请求,使用异步请求应该通过enqueue()方法

返回的response就是服务器返回的对象了。
在返回的response中可以获取到需要的数据。如果我们需要得到具体的返回对象,可以通过如下写法来获取

String responseData=response.body().string();//这里直接是string()方法,不是toString()

如果需要添加header或者发起post则时如下

//发起POST
RequestBody requestBody=new FormBody.builder()
						.add("key","value").build;//新建requestbody
Request request =new Request.Builder().url("www.baidu.com")
							.post(requestBody).build();//使用post()发送

//添加header
Request request = new Request.Builder().url("www.baidu.com")
							.addheader("key1","value1")//使用addheader()时,输入的key值如果相同,会增加一个新的value
							.header("key2","value2")//使用header()时,如果出现相同的key,会将原有的value删去替换成新的key.
							.build();

代码如下

package com.example.okhttptest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.jetbrains.annotations.NotNull;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.internal.http2.Header;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    TextView textView;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView=findViewById(R.id.textview);
        button=findViewById(R.id.button1);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if(view.getId()==R.id.button1){						
            sendRequestWithOkhttp();						//通过OkHttp进行网络通信
        }
    }
    private void sendRequestWithOkhttp(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient client=new OkHttpClient();
                    Request request=new Request.Builder().url(getResources().getString(R.string.url))
                            .header("avoidVerify","1").build();
                    client.newCall(request).enqueue(new Callback() {					//异步请求
                        @Override
                        public void onFailure(@NotNull Call call, @NotNull IOException e) {
                           showResponse(e.getMessage());
                        }

                        @Override
                        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                            String responsebody=response.body().string();
                            showResponse(responsebody);
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            }).start();
    }
    //跳回主线程更新UI
    protected  void showResponse(final String string){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                textView.setText(string);
            }
        });
    }
}

UI界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
<Button
    android:id="@+id/button1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="press here"
    android:textSize="40sp"/>
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/textview"
        />
    </ScrollView>
</LinearLayout>

最后不要忘了声明权限

<uses-permission android:name="android.permission.INTERNET"/>

基于Okhttp的网络通信的初步认识

上一篇:改进HTTPS连接无法在Android中运行


下一篇:android – 如何通过OkHttpClient Interceptor将baseUrl(host)添加到Picasso?