Android:Okhttp3详解(get和post同步异步文件上传)

准备工作

导入依赖

dependencies {
    implementation("com.squareup.okhttp3:okhttp:4.9.0")
}

配置网络权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.networklearn1">

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

</manifest>

准备4个请求按钮

<?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=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Get同步请求"
        android:onClick="get1"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="get异步请求"
        android:onClick="get2"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="post同步请求"
        android:onClick="post1"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="post异步请求"
        android:onClick="post2"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="post上传文件"
        android:onClick="uploadFile"/>

</LinearLayout>

主页面配置okhttpClient对象

public class MainActivity extends AppCompatActivity {

    private OkHttpClient okHttpClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        okHttpClient = new OkHttpClient();
    }

    public void get1(View view) {
    }

    public void get2(View view) {
    }

    public void post1(View view) {
    }

    public void post2(View view) {
    }
}

Get同步请求

请求代码

public void get1(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();
                    Log.i("test",response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

响应内容

I/test: {
      "args": {
        "a": "1", 
        "b": "2"
      }, 
      "headers": {
        "Accept-Encoding": "gzip", 
        "Host": "www.httpbin.org", 
        "User-Agent": "okhttp/4.9.0", 
        "X-Amzn-Trace-Id": "Root=1-6230a3bc-3cff97ac41773a7531d5fc08"
      }, 
      "origin": "117.143.100.243", 
      "url": "https://www.httpbin.org/get?a=1&b=2"
    }

Get异步请求

请求代码

public void get2(View view) {
        Request request = new Request.Builder()
                .url("https://www.httpbin.org/get?a=1&b=2")
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                if (response.isSuccessful()){
                    Log.i("test",response.body().string());
                }
            }
        });
    }

响应内容

I/e.networklearn: Waiting for a blocking GC ProfileSaver
I/e.networklearn: WaitForGcToComplete blocked ProfileSaver on HeapTrim for 33.822ms
I/test: {
      "args": {
        "a": "1", 
        "b": "2"
      }, 
      "headers": {
        "Accept-Encoding": "gzip", 
        "Host": "www.httpbin.org", 
        "User-Agent": "okhttp/4.9.0", 
        "X-Amzn-Trace-Id": "Root=1-6230a57f-7e16a25538f5ec0a55c224b2"
      }, 
      "origin": "117.143.100.243", 
      "url": "https://www.httpbin.org/get?a=1&b=2"
    }

Post同步请求

请求代码

public void post1(View view) {

        new Thread(){
            @Override
            public void run() {
                FormBody formBody = new FormBody.Builder()
                        .add("a","1")
                        .add("b","1")
                        .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();
                    Log.i("test",response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

响应内容

I/test: {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "a": "1", 
        "b": "1"
      }, 
      "headers": {
        "Accept-Encoding": "gzip", 
        "Content-Length": "7", 
        "Content-Type": "application/x-www-form-urlencoded", 
        "Host": "www.httpbin.org", 
        "User-Agent": "okhttp/4.9.0", 
        "X-Amzn-Trace-Id": "Root=1-6230a7be-57940c9a7c29181744eae16c"
      }, 
      "json": null, 
      "origin": "117.143.100.243", 
      "url": "https://www.httpbin.org/post"
    }

Post异步请求

请求代码

public void post2(View view) {
        FormBody formBody = new FormBody.Builder()
                .add("a","1")
                .add("b","1")
                .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(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                if (response.isSuccessful()){
                    Log.i("test",response.body().string());
                }
            }
        });
    }

响应内容

I/test: {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "a": "1", 
        "b": "1"
      }, 
      "headers": {
        "Accept-Encoding": "gzip", 
        "Content-Length": "7", 
        "Content-Type": "application/x-www-form-urlencoded", 
        "Host": "www.httpbin.org", 
        "User-Agent": "okhttp/4.9.0", 
        "X-Amzn-Trace-Id": "Root=1-6230a7d8-16dd1aa30c975a7d691c67b6"
      }, 
      "json": null, 
      "origin": "117.143.100.243", 
      "url": "https://www.httpbin.org/post"
    }

Post上传多个文件

常见文件格式
https://www.runoob.com/http/http-content-type.html

常见的媒体格式类型如下:

text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
以application开头的媒体格式类型:

application/xhtml+xml :XHTML格式
application/xml: XML数据格式
application/atom+xml :Atom XML聚合格式
application/json: JSON数据格式
application/pdf:pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:

multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

请求代码

public void uploadFile(View view) {
        File file1 = new File("E:\\FileTest\\001.jpg");
        File file2 = new File("E:\\FileTest\\002.jpg");
        RequestBody body1 = RequestBody.create(file1, MediaType.parse("image/jpeg"));
        RequestBody body2 = RequestBody.create(file2, MediaType.parse("image/jpeg"));
        MultipartBody multipartBody = new MultipartBody.Builder()
                .addFormDataPart("图片1", file1.getName(), body1)
                .addFormDataPart("图片2", file2.getName(), body2)
                .addFormDataPart("test","test")
                .build();
        Request request = new Request.Builder()
                .url("https://www.httpbin.org/post")
                .post(multipartBody)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                if (response.isSuccessful()){
                    Log.i("test",response.body().string());
                }
            }
        });
    }
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值