前言
最近在公司使用okhttp3发现现在网络大部分的使用教程都是基本的get与post,没有进行深入的使用,例如上传图片之类的都没有,特意写一个符合项目开发的常用请求,方便大家一起交流使用
使用教程
普通的get请求
private void get(String url, Map<String,String> params){ OkHttpClient okHttpClient = new OkHttpClient(); for (Map.Entry<String, String> entry : params.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); if (url.contains("?")) { url = url + "&" + key + "=" + value; } else { url = url + "?" + key + "=" + value; } } Request.Builder builder = new Request.Builder(); Request request = builder.url(url).build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //失败 } @Override public void onResponse(Call call, Response response) throws IOException { //成功 } }); }
普通的post请求
private void post(String url, Map<String, String> params) { OkHttpClient okHttpClient = new OkHttpClient(); Request.Builder builder = new Request.Builder(); FormBody.Builder formBodyBuilder = new FormBody.Builder(); for (Map.Entry<String, String> entry : params.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); formBodyBuilder.add(key, value); } Request request = builder.url(url).post(formBodyBuilder.build()).build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //失败 } @Override public void onResponse(Call call, Response response) throws IOException { //成功 } }); }
post上传图片,MultipartBody 的使用方法
private void postFile(String url, Map<String, String> params,Map<String, File> files) { OkHttpClient okHttpClient = new OkHttpClient(); Request.Builder builder = new Request.Builder(); MediaType MEDIA_TYPE_IMG = MediaType.parse("image/*") MultipartBody.Builder multiPartBodyBuilder = new MultipartBody.Builder(); //需要添加的参数 for (Map.Entry<String, String> entry : params.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); multiPartBodyBuilder.addFormDataPart(key, value); } //需要上传的文件 for (Map.Entry<String, File> entry : files.entrySet()) { String key = entry.getKey(); File value = entry.getValue(); multiPartBodyBuilder.addFormDataPart("file", key, RequestBody.create (MEDIA_TYPE_IMG, value)); } Request request = builder.url(url).post(multiPartBodyBuilder.build()).build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //失败 } @Override public void onResponse(Call call, Response response) throws IOException { //成功 } }); }
当服务器要求上传字符串也就是流上传的使用方法(我这上传服务器要求的是json),所有你要根据服务器的content-Type要求的类型进行设置
private void postStream(String url, String json) { OkHttpClient okHttpClient = new OkHttpClient(); Request.Builder builder = new Request.Builder(); MediaType mediaType = MediaType.parse("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create(mediaType, json); Request request = builder.url(url).post(requestBody).build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //失败 } @Override public void onResponse(Call call, Response response) throws IOException { //成功 } }); }
假如你需要添加Head的时候可以通过下面方法
private void addHeader(Map<String,String> headers){ Request.Builder builder = new Request.Builder(); for (Map.Entry<String, String> entry : headers.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); builder.addHeader(key, value); } }