okhttp的两种请求

mac2025-05-28  3

@[toc] OKHTTP的一些用法

OKHTTP的get请求

OkHttp是Square出的Http通讯库,支持HTTP和HTTP/2,用于Android应用和Java应用。 OkHttp是非常优秀的Http通讯库,将Http连接中各种繁杂的问题,对并发的支持,对常见异常的处理等封装在底层,提供简单易用的API供应用中调用。与之相比,HttpUrlConnection的使用过于复杂,Appache的HttpClient在Android平台上的运行又有各种问题,在Android 6.0之后,已经将HttpClient库从SDK中删除,全面转向使用OkHttp。 总而言之,OKHTTP就是一个用于网络操作的框架,用来简化我们的操作的时间和复杂度。

目前有很多知名的Android三方框架都使用OkHttp作为网络连接的默认基栈,例如Volley,Glide,Retrofit等,从中也能看出学习OkHttp的必要性。

请求json字符串

OKHTTP的重点就在于4个单词 : client ,request,call ,Response client就是利用OkHttp来创建一个客户端,而后发送请求,即是request. 然后就是与服务端进行一个链接,就是一个打电话的呼叫过程,最后就是 服务端对客户端的请求返回响应。

//client OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(3, TimeUnit.SECONDS) .readTimeout(3, TimeUnit.SECONDS) .build(); //request Request request = new Request.Builder().url(path).get().build(); //call Call call = client.newCall(request); //response call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Toast.makeText(MainActivity.this, "失败" + e.getMessage(), Toast.LENGTH_SHORT).show(); } @Override public void onResponse(Call call, final Response response) throws IOException { ResponseBody body = response.body(); final String string = body.string(); handler.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "" + string, Toast.LENGTH_SHORT).show(); } }); } });

post 请求json字符串

//client OkHttpClient client = new OkHttpClient.Builder() .readTimeout(3, TimeUnit.SECONDS) .connectTimeout(3, TimeUnit.SECONDS) .build(); //request FormBody formBody = new FormBody.Builder() .add("page", "1") .build(); Request request = new Request.Builder() .url(post_path) .post(formBody) .build(); //call Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "" + e.getMessage(), Toast.LENGTH_SHORT).show(); } }); } @Override public void onResponse(Call call, Response response) throws IOException { final String string = response.body().string(); handler.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "" + string, Toast.LENGTH_SHORT).show(); } }); } });

OKHTTP 下载

//client OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(3, TimeUnit.SECONDS) .readTimeout(3, TimeUnit.SECONDS) .build(); //request final Request request = new Request.Builder() .url(load_path) .get() .build(); //call client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "" + e.getMessage(), Toast.LENGTH_SHORT).show(); } }); } @Override public void onResponse(Call call, Response response) throws IOException { // File file = new File(mp4_path); int count = 0; File directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); String state = Environment.getExternalStorageState(); File file1 = Environment.getExternalStorageDirectory(); if (state.equals(Environment.MEDIA_MOUNTED)) { FileOutputStream fos = new FileOutputStream(new File(directory, "houzi.mp4")); long l = response.body().contentLength(); InputStream is = response.body().byteStream(); int len; byte[] bytes = new byte[1024]; while ((len = is.read(bytes)) != -1) { fos.write(bytes, 0, len); count += len; fos.flush(); int progress = (int) ((count * 100) / l); Message obtain = Message.obtain(); obtain.what = 120; obtain.obj = progress; handler.sendMessage(obtain); } fos.close(); is.close(); } } });

上传

在上传的过程中,最重要的就是在请求的请求体,应为上传的时候需要携带数据,而数据就是储存在请求体中。 而这就需要在请求时进行一些区别于正常的的操作 了。

//client OkHttpClient client = new OkHttpClient.Builder() .readTimeout(20, TimeUnit.SECONDS) .connectTimeout(20, TimeUnit.SECONDS) .build(); //request RequestBody requestBody = RequestBody.create(MediaType.parse("media/mp4"), new File(upload_path)); MultipartBody multipartBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", "monkey.mp4", requestBody) .build(); //主要是在这里的post()中需要天记上数据,在这里需要加入一个body对象,就是MultipartBody 对象 而在MultipartBod 中又要添加一个RequestBody对象。 Request request = new Request.Builder() .url(upload_path_mp4) .post(multipartBody) .build(); //call 和 response client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "上传失败" + e.getMessage(), Toast.LENGTH_SHORT).show(); } }); } @Override public void onResponse(Call call, Response response) throws IOException { handler.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "上传成功", Toast.LENGTH_SHORT).show(); } }); } });
最新回复(0)