OkHttp-OkHttp的使用

项目加入OkHttp

在build.gradle中加入以下代码,OkHttp最新版本可以在官网查看。

implementation 'com.squareup.okhttp3:okhttp:最新版本'

添加完成之后,进行sync now,然后,在AndroidManiifest.xml中添加网络权限。

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

GET请求

步骤

  1. new OkHttpClient;
  2. 构造Request对象;
  3. 通过前两步中的对象构建Call对象;
  4. 通过Call#enqueue(Callback)方法来提交异步请求;

异步Get

String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient(); //获得OkHttpClient对象
final Request request = new Request.Builder() //构造Request对象
        .url(url)
        .get()//默认就是GET请求,可以不写
        .build();
Call call = okHttpClient.newCall(request); 获得Call对象
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Log.d(TAG, "onFailure: ");
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        Log.d(TAG, "onResponse: " + response.body().string());
    }
});

同步Get

同步Get只需要使用Call#execute就可以实现,由于同步的Get是在主线程中进行的,当请求时间过长时,会发生ANR的错误。
因此在android 3.0之后,直接改成了在主线程中访问网络会引起异常。

android.os.NetworkOnMainThreadException

同步Get需要在子线程中执行。

String url = "https://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
        .url(url)
        .build();
final Call call = okHttpClient.newCall(request);
new Thread(new Runnable() {
    @Override
    public void run() {
        Response response = null;
        try {
            response = call.execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

POST请求

使用OkHttp发送POST请求与GET请求类似,不同的是,发送POST请求需要附带一个RequestBody,如果POST请求不是发送表单数据,还需要提供一个MediaType对象指明传输的数据的类型。

发送表单数据

OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
        .add("name", "echo")  //添加表单数据
        .build();
Request request = new Request.Builder()
        .url("https://en.wikipedia.org/w/index.php")
        .post(requestBody)  //post方法中传入请求体
        .build();

okHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Log.d(TAG, "onFailure: " + e.getMessage());
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        Log.d(TAG, "onResponse: " + response.body().string());
    }
});

提交文件

当POST不是传输表单数据时,还需要使用MediaType对象指出传输文件的类型,MediaType接收MIME类型,关于MIME类型可以参考MIME参考手册

MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
OkHttpClient okHttpClient = new OkHttpClient();
File file = new File("test.md"); //取得传输文件
RequestBody requestBody = RequestBody.create(mediaType,file); //通过RequestBody.create方法,使用MediaType对象和File构造RequestBody对象。
Request request = new Request.Builder()
        .url("https://www.baidu.com/")
        .post(requestBody)
        .build();
okHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Log.d(TAG, "onFailure: " + e.getMessage());
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        Log.d(TAG, "onResponse: " + response.body().string());
    }
});

提交数据流

RequestBody requestBody = new RequestBody() {
    @Nullable
    @Override
    public MediaType contentType() {
        return MediaType.parse("text/x-markdown; charset=utf-8"); //指定流的类型
    }

    @Override
    public void writeTo(BufferedSink sink) throws IOException {
        sink.writeUtf8("I am Jdqm."); 
    }
};

Request request = new Request.Builder()
        .url("https://www.baidu.com/")
        .post(requestBody)
        .build();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Log.d(TAG, "onFailure: " + e.getMessage());
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        Log.d(TAG, "onResponse: " + response.body().string());
    }
});

提交String

MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
String requestBody = "I am Jdqm.";
Request request = new Request.Builder()
        .url("https://api.github.com/markdown/raw")
        .post(RequestBody.create(mediaType, requestBody))
        .build();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Log.d(TAG, "onFailure: " + e.getMessage());
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        Log.d(TAG, "onResponse: " + response.body().string());
    }
});

添加请求头部

在构建Request对象的时候可以添加请求头部。

Request request = new Request.Builder()
                        .url("https://www.baidu.com/")
                        .addHeader("key","value") //添加头部。
                        .post(requestBody)
                        .build();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值