安卓网络请求---OkHttpClinet

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();
    }



}

猜你喜欢

转载自blog.csdn.net/weixin_41957626/article/details/129781496