首先:
compile 'com.squareup.okhttp3:okhttp:3.3.0'具体用法:
/** * Created by Mao on 2018/1/19. */ public class OkHttpUtils { private OkHttpClient client=null; public OkHttpUtils(){ client=new OkHttpClient(); } public OkHttpUtils(File cacheDir){ int cacheSize=5*1024*1024; //设置缓存的路径和大小 Cache cache=new Cache(cacheDir,cacheSize); OkHttpClient.Builder builder =new OkHttpClient.Builder(); client=builder.cache(cache).build(); } //get请求使用 public void get(String url){ Request.Builder builder=new Request.Builder(); builder.url(url).addHeader("mDefine","123");//自己定义的一个请求头 Request request=builder.build(); String header_value=request.header("mDefine"); Log.d("MVE","header_value=="+header_value); //同步请求,会阻塞当前的线程去获取数据 //Response response=client.newCall(request).execute(); //异步请求,不会阻塞当前线程会新开一个工作线程 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //请求失败时执行 Log.d("MVE","请求失败"); e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { //请求成功时执行 //响应体 ResponseBody responseBody=response.body(); /* * string():将响应体中的数据转换为字符串 * 注意:string()方法会将所有的数据放入内存中,所以当数据超过1M时 * 最好不要调用该方法,以免占用过多的内存。这种情况下可以考虑将数据当作流来处理。 * */ if (responseBody.contentLength()>1024*1024){ //如果大于1M转为流在进行处理 InputStream is=responseBody.byteStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String str=""; StringBuilder stringBuilder=new StringBuilder(); if ((str=br.readLine())!=null){ stringBuilder.append("/n"+str); } Log.d("MVE","responsStr=="+stringBuilder.toString()); } else { String responsStr=responseBody.string(); Log.d("MVE","responsStr=="+responsStr); } } }); } //post发送键值对(Form表单信息) public void postForm(String url, Map<String,String> map){ //FormBody继承自RequestBody,类似于Form表单,可以在其中放一些键值对数据 FormBody.Builder formBuilder=new FormBody.Builder(); for (Map.Entry<String,String> entry:map.entrySet()){ formBuilder.add(entry.getKey(),entry.getValue()); } FormBody formBody=formBuilder.build(); Request.Builder requestBuilder=new Request.Builder(); Request request=requestBuilder.url(url).post(formBody).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d("MVE","请求失败"); e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { String responseStr=response.body().string(); Log.d("MVE","responseStr=="+responseStr); } }); } public static final MediaType MEDIA_TYPE_IMG=MediaType.parse("image/jpg"); //post上传文件 /* * MediaType指的是要传递的数据MIME类型,其包含三种信息type、subtype、charset * eg:MediaType.parse("text/html;charset=utf-8");其中type值是text,表示 * 文本这一大类,subtype值是html,表示文本这一大类下的html这一小类,最后charset=utf-8 * 表示编码格式,如果传递的是文本就需要带上charset. * 一般只需要将这些信息传入parse()方法中,就可以解析出MediaType对象。 * */ public void postFile(String url,String path){ File file=new File(path); Request request=new Request.Builder() .url(url) .post(RequestBody.create(MEDIA_TYPE_IMG,file)) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { Log.d("MVE","responseBody=="+response.body().string()); } }); } //post发送多样式数据(上传文件的同时传递键值对参数) public void postMul(String url,Map<String,String> map,String path){ MultipartBody.Builder builder=new MultipartBody.Builder(); for (Map.Entry<String,String> entry:map.entrySet()){ //添加键值对数据 builder.addFormDataPart(entry.getKey(),entry.getValue()); } File file=new File(path); /* * MultipartBody.FORM 参数:W3C定义的multipart/form-data类型 * */ builder.setType(MultipartBody.FORM); //添加要上传的文件 builder.addFormDataPart("image",file.getName(),RequestBody.create(MEDIA_TYPE_IMG,file)); RequestBody requestBody=builder.build(); Request request=new Request.Builder() .url(url) .post(requestBody) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { } }); } }