OkHttpClinet的创建和使用
1.1效果图
运行界面
获取get同步请求的信息
。。。
获取post异步请求的数据
1.2配置文件
1.网络的配置
<uses-permission android:name="android.permission.INTERNET"/>
2.全局build的配置
主要就是配置第一个的maven,第二个的不用进行配置的。不然会报错的。
下面的不需要进行配置的。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
maven{
url 'https://maven.aliyun.com/repository/google'}
maven{
url 'https://maven.aliyun.com/repository/jcenter'}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.2'
}
}
allprojects {
repositories {
jcenter()
// maven{
url 'https://maven.aliyun.com/repository/google'}
// maven{
url 'https://maven.aliyun.com/repository/jcenter'}
// maven{
url 'http://maven.aliyun.com/nexus/content/groups/public/'}
// maven{
url 'https://maven.aliyun.com/repository/google'}
// maven{
url 'https://maven.aliyun.com/repository/jcenter'}
}
}
3.在安卓编译的Compiler进行设置
-x :app:mockableAndroidJar
4.设置模块项目的依赖配置
就是需要设置dependencies就可以。
注意okHttp的版本不要设置过高,不然会出现错误的。
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:+'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
}
//https://www.likecs.com/show-203487824.html 错误解决
//设置okhhtp的时候okhttp的版本不符合导致无法使用,>4的好像都不可以用
1.3布局文件的设置
四个按钮,设置对应的事件监听的方式用于设置处理不同的请求的方式。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_ok_http_test"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="cn.test.network.OkHttpTest">
<Button
android:text="Http同步请求"
android:onClick="getSync"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:text="Http异步请求"
android:onClick="getAsync"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:text="Post同步请求"
android:onClick="postSync"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:text="Post同步请求"
android:onClick="postAsync"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
1.4activity的设置
1.4.1方法介绍
1.先创建一个private OkHttpClient okHttpClient;注意需要new啊
2.对于get的同步请求的方式
设置所有请求方式的时候不能设置非https的请求的方式
- 设置Request,主意啊
Request request=new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
Call call=okHttpClient.newCall(request);
Response response=call.execute();//接收响应的数据
System.out.println("getSync获取的数据:"+response.body().string()); //打印响应的数据
3.get的异步请求
- 区别在于call的时候需要设置成异步的方式进行响应需要的结果的信息
- 第一个方法是请求服务器失败的时候就会触发的
- 第二个方式是只要是请求服务器成功就会进行响应的方法。不管是是否处理用户的请求是不是成功了都会进行调用的。
//enqueue方法就是异步请求的方法,需要设置一个回调的函数
call.enqueue( new Callback() {
@Override
//请求失败的
public void onFailure(Call call, IOException e) {
}
//请求完成的,跟服务器的通信是成功的,不管是不是响应成功的数据
/*
* 200-299一般是请求成功的
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
//服务器给我们的响应的数据
System.out.println("get异步请求获取的数据:"+response.body().string());
}
catch (Exception e){
System.out.println("获取数据失败"+e);
}
}
}
);
3.处理post的请求的时候需要设置传入的参数的信息
- FormBody可以设置我们请求的参数,add可以添加多个请求的参数的信息
FormBody formBody=new FormBody.Builder()
.add("a","1")
.add("b","2")
.build();
- 创建Request的时候需要设置成post的提交的方式
Request request=new Request.Builder().url("https://www.httpbin.org/post")
.post(formBody)
.build();
其余的和get的方式是类似的 。
1.4.2代码
package cn.test.network;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkHttpTest extends Activity {
private OkHttpClient okHttpClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ok_http_test);
okHttpClient=new OkHttpClient();
}
// 设置事件监听的方法
// 注意安卓中是默认禁止访问http类型的请求的,必须得是https的访问的类型的
public void getSync(View view){
new Thread(){
@Override
public void run() {
Request request=new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
Call call=okHttpClient.newCall(request);
try {
Response response=call.execute();
//服务器给我们的响应的数据
System.out.println("getSync获取的数据:"+response.body().string());
}
catch (Exception e){
System.out.println("获取数据失败"+e);
}
}
}.start();
}
// get的异步请求
public void getAsync(View view){
new Thread(){
@Override
public void run() {
Request request=new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
/*
* 异步请求的方法并不会阻碍后面代码的执行
* */
Call call=okHttpClient.newCall(request);
try {
//enqueue方法就是异步请求的方法,需要设置一个回调的函数
call.enqueue(
new Callback() {
@Override
//请求失败的
public void onFailure(Call call, IOException e) {
}
//请求完成的,跟服务器的通信是成功的,不管是不是响应成功的数据
/*
* 200-299一般是请求成功的
* 300-399一般是重定向的
* */
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
//服务器给我们的响应的数据
System.out.println("get异步请求获取的数据:"+response.body().string());
}
catch (Exception e){
System.out.println("获取数据失败"+e);
}
}
}
);
}
catch (Exception e){
System.out.println("获取数据失败"+e);
}
}
}.start();
}
//采用post的同步请求的方式
public void postSync(View view){
new Thread(){
@Override
public void run() {
//采用form表单的方式进行数据的提交
FormBody formBody=new FormBody.Builder()
.add("a","1")
.add("b","2")
.build();
Request request=new Request.Builder().url("https://www.httpbin.org/post")
.post(formBody)
.build();
Call call=okHttpClient.newCall(request);
try {
Response response=call.execute();
System.out.println("同步post请求,"+response.body().string());
} catch (IOException e) {
System.out.println("出错了,"+e);
}
}
}.start();
}
//post异步请求
public void postAsync(View view){
new Thread(){
@Override
public void run() {
//采用form表单的方式进行数据的提交
FormBody formBody=new FormBody.Builder()
.add("a","1")
.add("b","2")
.build();
Request request=new Request.Builder().url("https://www.httpbin.org/post")
.post(formBody)
.build();
//异步的方式
Call call=okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
System.out.println("异步post请求,"+response.body().string());
} catch (IOException e) {
System.out.println("出错了,"+e);
}
}
});
}
}.start();
}
}