下面的get和post都必须在子线程中执行,是张鸿洋大佬封装的
get请求:
private OkHttpClient client = new OkHttpClient();
String get(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
post请求:
private OkHttpClient client = new OkHttpClient();
public static final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
post请求第二个参数是请求的上传的json数据。如果没有要上传这赋值:“”
还有一种不用jar包的方式:
OkHttpUtils的使用:
在github搜索OkHttp,哪个点赞多点击哪个好吧。之后拉到下面找到下面这个:
将 implementation(“com.squareup.okhttp3:okhttp:4.4.0”) 复制进 build.gradle文件(dependencies 里面)。然后进行右上角的同步。即可是使用了。
直接上全部代码先理解着,再写详细点:
这个是基本的思路:
//1,有个客户端,这个客户的属性是等待时间
//2,这个客户的行为是发出请求,包括请求的地址,方式
//3,客户开始发出请求
//请求方式(异步,同步)
public class MainActivity extends AppCompatActivity {
private static final String PATH ="http://192.168.137.1:8080/cookie_war_exploded/ShopInfoServlet" ;
private static final String TAG="okhttp";
private static final String UPLOAD_PATH="http://192.168.137.1:8080/upload_war_exploded/upload";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//get
public void getRequest(View view){
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.build();
//创建连接请求内容
Request request=new Request.Builder()
.get()
.url(PATH)
.build();
//用Client去创建请求任务
Call task=okHttpClient.newCall(request);
//异步任务
task.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.e(TAG," onFailure:"+e.toString());
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
int code = response.code();
if(code== HttpURLConnection.HTTP_OK){
Log.e(TAG,"code:"+code);
ResponseBody body = response.body();
Log.e(TAG,"onResponse :"+body.string());
}
}
});
}
//post
public void postCommit(View view){
//先有CLient
OkHttpClient client=new OkHttpClient.Builder()
.connectTimeout(10000,TimeUnit.MILLISECONDS)
.build();
//要提交的内容
String str="在吗";
str=new Gson().toJson(str);
MediaType mediaType=MediaType.parse("application/json");
RequestBody body=RequestBody.create(str,mediaType);
final Request request=new Request.Builder()
.post(body)
.url(PATH)
.build();
Call task=client.newCall(request);
task.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.e(TAG,"onFailure"+e.toString());
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
int code = response.code();
ResponseBody responseBody = response.body();
Log.e(TAG,"onResponse"+code+"----"+responseBody.string());
}
});
}
//上传文件到服务器。
public void postFile(View view){
OkHttpClient client=new OkHttpClient.Builder()
.connectTimeout(10000,TimeUnit.MILLISECONDS)
.build();
//这个地址是,我在文件里面直接复制的。
//然后就是只能复制这个工程下的文件路径,如果调用别的工程文件路径会报错
File file=new File("/data/data/com.example.myapplication/files/123.txt");
//这个是文件的Mime类型:https://www.sunofbeach.net/a/1202497837313675264。这个网址有各种类型,自己找
MediaType fileType=MediaType.parse("text/plain");
RequestBody fileBody=RequestBody.create(file,fileType);
final RequestBody requestBody = new MultipartBody.Builder()
.addFormDataPart("file",file.getName(),fileBody)
.build();
Request request=new Request.Builder()
.post(requestBody)
.url(UPLOAD_PATH)
.build();
Call task=client.newCall(request);
task.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.e(TAG,"onFailure....");
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
Log.e(TAG,"onResponse....");
if((response.code()==HttpURLConnection.HTTP_OK)){
ResponseBody body=response.body();
if(body!=null){
String result=body.string();
Log.e(TAG,"....");
}
}
}
});
}
//上传多文件
public void postFiles(View view){
//1,有个客户端,这个客户的属性是等待时间
OkHttpClient client=new OkHttpClient.Builder()
.connectTimeout(10000,TimeUnit.MILLISECONDS)
.build();
//文件的地址
File file1=new File("/data/data/com.example.myapplication/files/456.txt");
File file2=new File("/data/data/com.example.myapplication/files/123.txt");
//文件的类型
MediaType mediaType=MediaType.parse("text/plain");
//将文件的地址和类型封装在一起,对应文件对应着对应的类型
RequestBody body1=RequestBody.create(file1,mediaType);
RequestBody body2=RequestBody.create(file2,mediaType);
//将多个文件封装着一个(可以理解为压缩)
RequestBody requestBody=new MultipartBody.Builder()
.addFormDataPart("file", file1.getName(),body1)
.addFormDataPart("file", file2.getName(),body2)
.build();
//2,这个客户的行为是发出请求,包括请求的地址,方式
Request request=new Request.Builder()
.url(UPLOAD_PATH)
.post(requestBody)
.build();
//3,客户开始发出请求
Call task=client.newCall(request);
//这个请求是通过异步任务的方式
task.enqueue(new Callback() {
//如果打不通,则failure
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.e(TAG,"onFailure....");
}
//成功则返回response
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
Log.e(TAG,"onResponse....");
if((response.code()==HttpURLConnection.HTTP_OK)){
ResponseBody body=response.body();
if(body!=null){
String result=body.string();
Log.e(TAG,"....");
}
}
}
});
}
}
上传多文件(注释是思路)
//上传多文件
public void postFiles(View view){
//1,有个客户端,这个客户的属性是等待时间
OkHttpClient client=new OkHttpClient.Builder()
.connectTimeout(10000,TimeUnit.MILLISECONDS)
.build();
//文件的地址
File file1=new File("/data/data/com.example.myapplication/files/456.txt");
File file2=new File("/data/data/com.example.myapplication/files/123.txt");
//文件的类型
MediaType mediaType=MediaType.parse("text/plain");
//将文件的地址和类型封装在一起,对应文件对应着对应的类型
RequestBody body1=RequestBody.create(file1,mediaType);
RequestBody body2=RequestBody.create(file2,mediaType);
//将多个文件封装着一个(可以理解为压缩)
RequestBody requestBody=new MultipartBody.Builder()
.addFormDataPart("file", file1.getName(),body1)
.addFormDataPart("file", file2.getName(),body2)
.build();
//2,这个客户的行为是发出请求,包括请求的地址,方式
Request request=new Request.Builder()
.url(UPLOAD_PATH)
.post(requestBody)
.build();
//3,客户开始发出请求
Call task=client.newCall(request);
//这个请求是通过异步任务的方式
task.enqueue(new Callback() {
//如果打不通,则failure
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.e(TAG,"onFailure....");
}
//成功则返回response
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
Log.e(TAG,"onResponse....");
if((response.code()==HttpURLConnection.HTTP_OK)){
ResponseBody body=response.body();
if(body!=null){
String result=body.string();
Log.e(TAG,"....");
}
}
}
});
}