OkHttp3简单使用

首先:

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 {

            }
        });
    }
}



猜你喜欢

转载自blog.csdn.net/start_mao/article/details/79108592