简介

OKhttp3是一个高效、节省带宽、支持HTTP2的HTTP客户端。

传送门:

GitHub:https://github.com/square/okhttp

官网:https://square.github.io/okhttp/

引入框架

在build.gradle(app)中的dependencies节点下添加:

implementation(“com.squareup.okhttp3:okhttp:4.1.1”)

dependencies {

implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation 'androidx.appcompat:appcompat:1.0.2'

implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

testImplementation 'junit:junit:4.12'

androidTestImplementation 'androidx.test:runner:1.1.1'

androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

//OKhttp

implementation("com.squareup.okhttp3:okhttp:4.1.1")

}


后端环境

后端我是用Tomcat+sevlet实现的后端服务器,主要代码如下

MyServlet.class

package com.dimanche;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.google.gson.Gson;

import com.sun.org.apache.bcel.internal.generic.NEW;

/**

* Servlet implementation class MyServlet

*/

@WebServlet("/MyServlet")

public class MyServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

System.out.println("get请求");

PrintWriter out = response.getWriter();

String method = request.getParameter("method");// 获取方法

User user = new User("111", "test", "test");

Result result = new Result();

result.setResult("true");

result.setObject(user);

out.println(new Gson().toJson(result));

}

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

System.out.println("post请求");

PrintWriter out = response.getWriter();

String method = request.getParameter("method");// 获取方法

System.out.println("表单"+method);

StringBuffer json = new StringBuffer();

String line = null;

BufferedReader reader = request.getReader();

while ((line = reader.readLine()) != null) {

json.append(line);

}

System.out.println("字符串"+json.toString());


// 逻辑操作过程

// 返回计算结果

User user = new User("111", "test", "test");

Result result = new Result();

result.setResult("true");

result.setObject(user);

out.println(new Gson().toJson(result));

}

}

Result.class

package com.dimanche;

public class Result {

String result;

Object object;

public String getResult() {

return result;

}

public void setResult(String result) {

this.result = result;

}

public Object getObject() {

return object;

}

public void setObject(Object object) {

this.object = object;

}

}

User.class

package com.dimanche;

public class User {

private String id;

private String userName;

private String userCode;


public User(String id, String userName, String userCode) {

this.id = id;

this.userName = userName;

this.userCode = userCode;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getUserCode() {

return userCode;

}

public void setUserCode(String userCode) {

this.userCode = userCode;

}

}


代码已上传百度云:

链接:https://pan.baidu.com/s/1XgBADUtPruig5wLZkULjTw

提取码:53e2

OKhttp的简单使用

说明

url地址为:

public static final String BASE_URL = “http://192.168.18.1:8088/MyJspProject/MyServlet”;

其中的192.168.18.1:8088为我电脑的ip加端口,你们修改为自己的即可

使用OKhttp进行异步get请求

public static void getData(String url) {

OkHttpClient okHttpClient = new OkHttpClient();

Request request = new Request.Builder()

.url(url)//值得顶地址

.get()//指定请求方式

.build();

//获取Call对象

Call call = okHttpClient.newCall(request);

//开启请求,使用execute时同步请求,使用enqueue时异步请求

call.enqueue(new Callback() {

@Override

public void onFailure(Call call, IOException e) {

//访问失败

Log.e("异步get请求失败", e.getMessage());

}

@Override

public void onResponse(Call call, Response response) throws IOException {

//访问成功

Log.e("异步get请求成功", response.body().string());

}

});

}


使用Post异步提交字符串

public static void subString(String url) {

//声明提交的数据类型

MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");

//声明RequestBody

RequestBody body = RequestBody.create(mediaType, "我被提交啦,哈哈哈哈");

//声明OkHTTPClient对象

OkHttpClient okHttpClient = new OkHttpClient();

//创建Request对象

Request request = new Request.Builder()

.url(url)//指定访问地址

.post(body)//指定请求方式

.build();

//获取Call对象

Call call = okHttpClient.newCall(request);

call.enqueue(new Callback() {

@Override

public void onFailure(Call call, IOException e) {

//访问失败

Log.e("异步Post请求失败", e.getMessage());

}

@Override

public void onResponse(Call call, Response response) throws IOException {

//访问成功

Log.e("异步psot请求成功", response.body().string());

}

});

}


使用post异步提交表单

public static void subForm(String url) {

//创建OKhttpClient对象

OkHttpClient okHttpClient = new OkHttpClient.Builder()

.addInterceptor(new TestInterceptor())

.build();

//创建RequestBody,使用FormBody描述请求体

RequestBody requestBody = new FormBody.Builder()

.add("method", "login")//添加参数

.build();

//创建Request对象

Request request = new Request.Builder()

.url(url)//指定地址

.post(requestBody)//指定访问方式并且加入请求体

.build();

//获取Call对象

Call call = okHttpClient.newCall(request);

//开始请求

call.enqueue(new Callback() {

@Override

public void onFailure(Call call, IOException e) {

Log.e("提交表单失败", "" + e.getMessage());

}

@Override

public void onResponse(Call call, Response response) throws IOException {

Log.e("提交表单成功", "" + response.body().string());

}

});

}


其中TestInterceptor为拦截器,代码如下

package com.dimanche.okhttp3.okhttp;

import android.util.Log;

import java.io.IOException;

import okhttp3.Interceptor;

import okhttp3.Request;

import okhttp3.Response;

/**

* Created by Dimanche on 2019/7/25.

* 创建拦截器类并且实现Interceptor接口,重写intercept方法

*/

public class TestInterceptor implements Interceptor {

@Override

public Response intercept(Chain chain) throws IOException {

Request request=chain.request();//获取Request

String url=request.url().url().toString();

Log.e("请求的地址:",url);

return chain.proceed(request);

}

}