依赖包

首先添加jar包,或着用maven或gradle自动导包。(我用的是3.9.1的包,自动导包时注意实际情况)

maven:

<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>okhttp</artifactId>
  <version>3.9.1</version>
</dependency>
gradle:

compile 'com.squareup.okhttp3:okhttp:3.9.1'

注意:还需要okio的包

maven:

<dependency>
  <groupId>com.squareup.okio</groupId>
  <artifactId>okio</artifactId>
  <version>1.13.0</version>
</dependency>
gradle:

compile 'com.squareup.okio:okio:1.13.0'

GET请求

String path="http://rehtt.cn"; OkHttpClient okHttpClient=new OkHttpClient(); Request request=new Request.Builder()         .url(path)
//如果要在request的的header添加参数。例如Cookie,User-Agent什么的:
        .header("键", "值")
         .header("键", "值")

        .build(); Call call=okHttpClient.newCall(request); try {
    Response response = call.execute();
    Log.i("返回:",response.body().string()); //返回网页body标签内容
//body()有多种输出方法,如果是下载文件就是response.body().bytes(),response.code()获取返回的状态码
} catch (IOException e) {
    e.printStackTrace();
}

POST请求

post请求与get请求几乎一样,只是post需要提交表单,使用RequestBody。

RequestBody的数据格式都要指定Content-Type,常见的有三种:

application/x-www-form-urlencoded 数据是个普通表单
multipart/form-data 数据里有文件
application/json 数据是个json

普通表单:

RequestBody body = new FormBody.Builder()
         .add("键", "值")
         .add("键", "值")
         ...
         .build();

文件表单:

RequestBody requestBody = new MultipartBody.Builder()
         .setType(MultipartBody.FORM)
         .addFormDataPart("file", file.getName(),RequestBody.create(MediaType.parse("image/png"), file))
         .build();

另外如果你上传一个文件不是一张图片,但是MediaType.parse(“image/png”)里的”image/png”不知道该填什么,可以参考这个。

JSON表单:

MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, "传入的json");

同步与异步

上文采用call.execute()执行http请求,但这是一个同步动作,是在主线程运行的。如果在UI线程执行就会抛异常。

所以在UI线程执行就要用异步,将call.execute()替换:

call.enqueue(new Callback() {
    @Override
//请求失败调用
    public void onFailure(Call call, IOException e) {

    }
    @Override
//请求成功调用
    public void onResponse(Call call, Response response) throws IOException {
        Log.e("返回:",response.body().string());
    }
});

onFailure()和onResponse()是在异步线程里执行的,所以如果你在Android把更新UI的操作写在这两个方法里面是会报错的,这个时候可以用runOnUiThread这个方法。

Last modification:October 23, 2019
如果觉得我的文章对你有用,请随意赞赏