Android 网络-->okhttp

来源:互联网 发布:汉朝使者知乎 编辑:程序博客网 时间:2024/05/29 17:02

  • 一个okhttp3请求的流程
    • 异步GET请求
    • 异步POST请求
    • 异步上传文件
    • 异步上传Multipart文件

一个okhttp3请求的流程

首先看一下okhttp3的异步GET/POST请求、文件上传/下载,异步上传Multipart文件。

异步GET请求

以请求淘宝为例

private void getAsynHttp() {//创建okHttpClient对象        mOkHttpClient=new OkHttpClient();//创建一个Request        Request.Builder requestBuilder = new Request.Builder().url("https://www.taobao.com/");        //可以省略,默认是GET请求        requestBuilder.method("GET",null);        Request request = requestBuilder.build();//new call        Call mcall= mOkHttpClient.newCall(request);//请求加入调度        mcall.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                if (null != response.cacheResponse()) {                    String str = response.cacheResponse().toString();                    Log.i("gt", "cache---" + str);                } else {                    response.body().string();                    String str = response.networkResponse().toString();                    Log.i("gt", "network---" + str);                }                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        Toast.makeText(getApplicationContext(), "请求成功", Toast.LENGTH_SHORT).show();                    }                });            }        });}

异步POST请求

private void postAsynHttp() {        mOkHttpClient=new OkHttpClient();        RequestBody formBody = new FormBody.Builder()                .add("size", "10")                .build();        Request request = new Request.Builder()                .url("http://api.1-blog.com/biz/bizserver/article/list.do")                .post(formBody)                .build();        Call call = mOkHttpClient.newCall(request);        call.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                String str = response.body().string();                Log.i("gt", str);                runOnUiThread(new Runnable() {                    @Override                    public void run() {              Toast.makeText(getApplicationContext(), "请求成功", Toast.LENGTH_SHORT).show();                    }                });            }        });}

异步上传文件

上传文件本身也是一个POST请求,首先定义上传文件类型:

public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");

将sdcard根目录的gt.txt文件上传到服务器上:

private void postAsynFile() {        mOkHttpClient=new OkHttpClient();        File file = new File("/sdcard/gt.txt");        Request request = new Request.Builder()                .url("https://api.github.com/markdown/raw")                .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))                .build();            mOkHttpClient.newCall(request).enqueue(new Callback() {                @Override                public void onFailure(Call call, IOException e) {                }                @Override                public void onResponse(Call call, Response response) throws IOException {                    Log.i("gt",response.body().string());                }            });        }

如果想要改为同步的上传文件只要调用 mOkHttpClient.newCall(request).execute()就可以了。
当然不要忘了添加如下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

异步下载文件
在这里下载一张图片,我们得到Response后将流写进我们指定的图片文件中就可以了

rivate void downAsynFile() {        mOkHttpClient = new OkHttpClient();        String url = "http://img.my.csdn.net/uploads/201603/26/1458988468_5804.jpg";        Request request = new Request.Builder().url(url).build();        mOkHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) {                InputStream inputStream = response.body().byteStream();                FileOutputStream fileOutputStream = null;                try {                    fileOutputStream = new FileOutputStream(new File("/sdcard/wangshu.jpg"));                    byte[] buffer = new byte[2048];                    int len = 0;                    while ((len = inputStream.read(buffer)) != -1) {                        fileOutputStream.write(buffer, 0, len);                    }                    fileOutputStream.flush();                } catch (IOException e) {                    Log.i("gt", "IOException");                    e.printStackTrace();               }               Log.d("gt", "文件下载成功");           }       });   }

异步上传Multipart文件

我们有时会上传文件同时还需要传其他类型的字段,首先定义上传文件类型:

private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
private void sendMultipart(){    mOkHttpClient = new OkHttpClient();    RequestBody requestBody = new MultipartBody.Builder()            .setType(MultipartBody.FORM)            .addFormDataPart("title", "gt")            .addFormDataPart("image", "gt.jpg",                    RequestBody.create(MEDIA_TYPE_PNG, new File("/sdcard/gt.jpg")))            .build();    Request request = new Request.Builder()            .header("Authorization", "Client-ID " + "...")            .url("https://api.imgur.com/3/image")            .post(requestBody)            .build();   mOkHttpClient.newCall(request).enqueue(new Callback() {       @Override       public void onFailure(Call call, IOException e) {       }       @Override       public void onResponse(Call call, Response response) throws IOException {           Log.i("gt", response.body().string());       }   });}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 重生之农门贵夫 野性偏爱 嫁给病弱太子后我躺赢了 咸鱼娘娘一心只想翻墙 救命!破产后高冷总裁处处招惹我 冷酷将军每天都想要贴贴 何以赎光 甜腻!病娇傅少竟然暗恋我! 天价萌妻:偏执帝少心尖宠 有读心术后,战神把娘子宠上天 穿书后,我刷错了反派的好感度 摄政王怀里的团宠美人娇又软 满级千金不想掉马 女帝她就是个卖药的! 华娱激荡年代 她来看我的演唱会 快穿:娇养反派大佬做替身 不努力种田就要和相公继承皇位了 穿书末世之我是金手指 转生恶少后的魔幻日常 穿书后我成了反派男二的铁血妈粉 带着超市重返年代 新婚夜,我被冷冰冰的王爷读心了 修仙女配拿了反派剧本 影后的假面童话 克死前夫后我成了心软的神 新婚夜,我治好了失明太子的隐疾 沦陷野玫瑰 完球!我的崽居然是反派 重生后她被憨憨相公娇宠了 师祖回归,徒弟各个是疯批大佬 植物人老公苏醒后,她只想逃 他怎么可能是魔尊 农家小团宠:带着空间撩大佬 快穿做个好婆婆 医路芳华 满级真千金:一品女法医 惊!举重妖精被电竞奶狗缠上了 团宠小农女:带着功德空间去逃荒 被迫快穿后我只想当咸鱼 顶流影帝竹马来讨债