安卓 原生okhttp使用get与post获取网络数据

Posted DQ_CODING

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓 原生okhttp使用get与post获取网络数据相关的知识,希望对你有一定的参考价值。

网址

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

配置

依赖

在module的build.gradle中:

    implementation 'com.squareup.okhttp3:okhttp:3.14.7'
    implementation 'com.squareup.okio:okio:1.17.5'

androidManifest.xml

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

xml文件

<?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"
    tools:context=".test.TestOKHttpActivity">
    <Button
        android:id="@+id/btn_get_post"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="get和post" />
    <TextView
        android:id="@+id/tv_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="xx"
        android:textSize="15sp"/>
</LinearLayout>

java代码

public class TestOKHttpActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_get_post;
    private TextView tv_result;
    private OkHttpClient client = new OkHttpClient();
    //设置编码类型
    public static final MediaType JSON
            = MediaType.get("application/json; charset=utf-8");
    //get和post请求标识
    private static final int GET = 1;
    private static final int POST = 2;
    //传递消息
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            //区分传递的是get还是post消息
            switch (msg.what) {
                case GET://获取数据
                    tv_result.setText((String) msg.obj);
                    break;
                case POST:
                    tv_result.setText((String) msg.obj);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_okhttp);
        init();
    }

    private void init() {
        //使用原生的okhttp请求网络数据,get和post
        btn_get_post = findViewById(R.id.btn_get_post);
        tv_result = findViewById(R.id.tv_result);

     
        btn_get_post.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            //使用原生的okhttp请求网络数据,get和post
            case R.id.btn_get_post:
                //getDataFromGet();//开启子线程,获取get
                getDataFromPost();//使用post获取数据
                break;
       
        }
    }

    //从子线程中获取网络数据
    private void getDataFromGet() {
        String url = "http://47.108.249.115:8080/LuShuDao0.0.2-1.0-SNAPSHOT/UserInfo/loginUser";
        new Thread() {
            @Override
            public void run() {
                super.run();
                String result = null;
                try {
                    result = get(url);
                    Log.e("Test", result);
                    Message message = Message.obtain();
                    message.what = GET;
                    message.obj = result;
                    handler.sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();

    }

    /*
    okhttp必须在子线程执行
    get请求
    url:请求网址
     */
    private String get(String url) throws IOException {
        Request request = new Request.Builder()
                .url(url)
                .build();
        try (Response response = client.newCall(request).execute()) {
            return response.body().string();
        }
    }


    //post请求,上传数据,在子线程中执行
    private String post(String url, String json) throws IOException {
        RequestBody body = RequestBody.create(JSON, json);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        try (Response response = client.newCall(request).execute()) {
            return response.body().string();
        }
    }

    //从子线程中获取网络数据
    private void getDataFromPost() {
        String url = "http://47.108.249.115:8080/LuShuDao0.0.2-1.0-SNAPSHOT/UserInfo/loginUser";
        new Thread() {
            @Override
            public void run() {
                super.run();
                String result = null;
                try {
                    //json是上传数据
                    result = post(url, "");
                    Log.e("Test", result);
                    Message message = Message.obtain();
                    message.what = POST;
                    message.obj = result;
                    handler.sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();

    }
}

总结

原生okhttp比较麻烦,使用第三方库去封装使用

以上是关于安卓 原生okhttp使用get与post获取网络数据的主要内容,如果未能解决你的问题,请参考以下文章

[技术博客]OKhttp3使用get,post,delete,patch四种请求

安卓网络编程学习——java原生网络编程

day10:kotlin的协程已经安卓网络技术初步

Android--第三方控件--okHttp

Okhttp 使用(同步、异步/get、post/上传文件)

深度探索!Android之OkHttp网络架构源码解析