导入依赖
dependencies {
implementation("com.squareup.okhttp3:okhttp:4.9.0")
}
配置网络权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.networklearn1">
<uses-permission android:name="android.permission.INTERNET"/>
manifest>
准备4个请求按钮
<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) {
}
}
请求代码
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"
}
请求代码
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"
}
请求代码
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"
}
请求代码
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"
}
常见文件格式
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 :
请求代码
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());
}
}
});
}