依赖包
首先添加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这个方法。