精华内容
下载资源
问答
  • OkHttpClient

    2020-06-02 15:57:14
    OkHttpClient前期准备使用OkHttpClient创建对象getpost 前期准备 在日常开发中,使用http的请求已经是主流;在此过程中,如果我们要使用一些对接接口的时候,比如支付宝支付的接口,需要发起http的请求来获取结果,...

    前期准备

    在日常开发中,使用http的请求已经是主流;在此过程中,如果我们要使用一些对接接口的时候,比如支付宝支付的接口,需要发起http的请求来获取结果,这个时候可以使用OkHttpClient;
    maven导入

          <dependency>
              <groupId>com.squareup.okhttp3</groupId>
              <artifactId>okhttp</artifactId>
              <version>3.8.1</version>
          </dependency>
    

    使用OkHttpClient

    创建对象

    在导入依赖后,可以直接使用new的方法来创建对象,但是为了考虑到一些超时机制,或者意外,可以设定超时机制

         OkHttpClient okHttpClient = new OkHttpClient.Builder()
                  //连接超时 设置
                 .connectTimeout(30, TimeUnit.SECONDS)
                  //读取超时
                 .readTimeout(30, TimeUnit.SECONDS)
                  //写超时
                  .writeTimeout(30, TimeUnit.SECONDS)
                  .build();
    

    get

    使用 OkHttp 进行 Get 请求只需要四个步骤

    1. 新建 OkHttpClient对象
    2. 构造 Request 对象
    3. 将 Request 对象封装为 Call
    4. 通过 Call 来执行同步或异步请求
        @Test
        public void demo() throws IOException {
            String url = "http://www.baidu.com";
            OkHttpClient okHttpClient = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(url)//如果需要 可以在url上拼接参数
                    .get()//默认为GET请求,可以不写
                    //.headers() 设置头文件
                    .build();
            // Call call = okHttpClient.newCall(request);
            // Response execute = call.execute();
            // 启用请求 并且获取响应体结果 来做出处理
            Response execute = okHttpClient.newCall(request).execute();
            //获取请求
            ResponseBody responseBody = execute.body();
            //结果转换为 为json结构
            String body = responseBody.string();
        }
    

    post

    创建 Post 请求的方式与 Get 方法类似,只是需要增加一个步骤,构造出一个请求参数对象RequestBody ,用于携带我们需要提交的数据。(下面均以 Post 的异步请求为例,Post 同步请求只需将 call.enqueue() 替换成 call.execute() 即可)

    public Builder post(RequestBody body)
    

    Request 的 post 方法所接收的参数是 RequestBody 对象,所以只要是 RequestBody 类及其子类都可以当做参数传入。

    RequestBody是一个抽象类,常用的 RequestBody 实现类有这么几种:

    1. FormBody
    OkHttpClient client = new OkHttpClient();
            //创建表单请求参数
            FormBody.Builder builder = new FormBody.Builder();
            builder.add("name", "zhangsan");
            builder.add("age", "18");
            FormBody formBody = builder.build();
            Request request = new Request.Builder()
                    .url(url)
                    .post(formBody)
                    .build();
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                }
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                }
            });
    
    1. RequestBody.create(…)
    MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
    		        RequestBody requestBody = RequestBody.create(mediaType, jsonParam);
    		        Request request = new Request.Builder()
    		            .url(url)
    		            .post(requestBody)
    		            .build();
    		        OkHttpClient okHttpClient = new OkHttpClient.Builder()
    		        		.connectTimeout(30, TimeUnit.SECONDS)
    		                .readTimeout(30, TimeUnit.SECONDS)
    		                .writeTimeout(30,TimeUnit.SECONDS)
    		                .build();
    		        Response execute = okHttpClient.newCall(request).execute();
    		        responseBody = execute.body();
    		        String body = responseBody.string();
    

    注:
    Content-Type(MediaType),即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件。常见的媒体格式类型有:

    text/html:HTML格式
    text/pain:纯文本格式
    image/jpeg:jpg图片格式
    application/json:JSON数据格式
    application/octet-stream:二进制流数据(如常见的文件下载)
    application/x-www-form-urlencoded:form表单encType属性的默认格式,表单数据将以key/value的形式发送到服务端
    multipart/form-data:表单上传文件的格式

    1. 使用MultipartBody同时上传多种类型数据
     OkHttpClient client = new OkHttpClient();
            MultipartBody multipartBody = new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart("name", "zhangsan")
                    .addFormDataPart("age", "20")
                    .addFormDataPart("file", file.getName(),
                            RequestBody.create(MediaType.parse("application/octet-stream"), file))
                    .build();
            
            Request request = new Request.Builder()
                    .url(url)
                    .post(multipartBody)
                    .build();
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                }
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                }
            });
    
    展开全文
  • okHttpClient上传下载

    2018-11-13 20:00:24
    mplementation 'com.squareup.okhttp3:okhttp:3.11.0' 然后添加权限 网络、读写、 &lt;uses-permission android:name="android.permission.INTERNET"/&gt; &lt;uses-permission android:...
    首先添加一个依赖:
    mplementation 'com.squareup.okhttp3:okhttp:3.11.0'

    然后添加权限  网络、读写、

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    布局:就两个按钮,一个图片
    
    <LinearLayout
        android:orientation="vertical"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="10dp">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <Button
                android:id="@+id/btn_upload"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="上传图片" />
            <Button
                android:id="@+id/btn_load"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="下载图片" />
        </LinearLayout>
    
    
        <ImageView
            android:id="@+id/img_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    
    
    </LinearLayout>

    逻辑---Activity

    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    
    import okhttp3.Call;
    import okhttp3.Callback;
    import okhttp3.MediaType;
    import okhttp3.MultipartBody;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        public static final String PATH = "https://10.url.cn/eth/ajNVdqHZLLAxibwnrOxXSzIxA76ichutwMCcOpA45xjiapneMZsib7eY4wUxF6XDmL2FmZEVYsf86iaw/";
        public static final String URL = "https://www.718shop.com/sell/sell.m.picture.upload.do";
        private Button btn_upload;
        private Button btn_load;
        private ImageView img_view;
        public static final int FALL = 123;
        public static final int SUCCESS = 100;
    
        private Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what){
                    case SUCCESS: //加载网络成功,进行UI的更新,处理得到的图片资源
                        byte[] obj = (byte[]) msg.obj;//通过message,拿到字节数组
                        Bitmap bitmap = BitmapFactory.decodeByteArray(obj, 0, obj.length);//使用BitmapFactory工厂,把字节数组转换为bitmap
                        img_view.setImageBitmap(bitmap); //通过ImageView,设置图片
                        break;
                    case FALL://当加载网络失败,执行的逻辑代码
                        Toast.makeText(MainActivity.this,"下载失败",Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        };
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //初始化控件
            initView();
        }
    
        /**
         * 根据点击事件获取络上的图片资源,使用的是OKhttp框架
         *
         * @param v
         */
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_upload://上传
                    //注意打印以下路径
                    Log.i("yz",""+Environment.getExternalStorageDirectory() + "/Pictures/Screenshots");
                    //创建上传文件对象
                    File file = new File(Environment.getExternalStorageDirectory() + "/Pictures/Screenshots", "meinv.png");
                    //创建RequestBody封装参数
                    RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
                    //创建MultipartBody,给RequestBody进行设置
                    MultipartBody multipartBody = new MultipartBody.Builder()
                            .setType(MultipartBody.FORM)
                            .addFormDataPart("image", "meinv.png", requestBody)
                            .build();
                    //创建Request
                    Request requests = new Request.Builder()
                            .url(URL)
                            .post(multipartBody)
                            .build();
                    //创建okhttp对象
                    OkHttpClient okHttpClients = new OkHttpClient.Builder()
                            .readTimeout(10, TimeUnit.SECONDS)
                            .connectTimeout(10,TimeUnit.SECONDS)
                            .writeTimeout(10,TimeUnit.SECONDS)
                            .build();
                    //上传完图片,得到服务器反馈数据
                    okHttpClients.newCall(requests).enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            Log.i("yz",""+e);
                        }
    
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this,"上传成功",Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    });
                    break;
                case R.id.btn_load://下载
                    //1. 创建OKhttpClient对象
                    OkHttpClient okHttpClient = new OkHttpClient.Builder()
                            .readTimeout(10, TimeUnit.SECONDS)
                            .connectTimeout(10,TimeUnit.SECONDS)
                            .writeTimeout(10,TimeUnit.SECONDS)
                            .build();
                    //2.建立Request对象,设置参数,请求方式如果是get,就不用设置,默认使用的就是get
                    Request request = new Request.Builder().url(PATH).build();
                    //3.创建一个Call对象,参数是request对象,发送请求
                    Call call = okHttpClient.newCall(request);
                    //4.异步请求,请求加入调度
                    call.enqueue(new Callback() {
                        @Override//请求失败回调
                        public void onFailure(Call call, IOException e) {
                            handler.sendEmptyMessage(FALL);
                        }
    
                        @Override//请求成功回调
                        public void onResponse(Call call, Response response) throws IOException {
                            //得到从网上获取资源,转换成我们想要的类型
                            byte[] bytes = response.body().bytes();
                            //通过handler更新UI
                            Message msg = handler.obtainMessage();
                            msg.obj = bytes;
                            msg.what = SUCCESS;
                            handler.sendMessage(msg);
                        }
                    });
                    break;
            }
        }
    
        private void initView() {
            btn_upload = findViewById(R.id.btn_upload);
            btn_load =findViewById(R.id.btn_load);
            img_view = findViewById(R.id.img_view);
    
            btn_upload.setOnClickListener(this);
            btn_load.setOnClickListener(this);
        }
    }

     

    展开全文
  • 1:创建一个OkHttpClient(发起请求的客户端) OkHttpClient.Builder builder = new OkHttpClient.Builder();//首先拿到创建者 builder.connectTimeout(30, TimeUnit.SECONDS); builder.readTimeout(30, TimeUni....

     1:创建一个OkHttpClient(发起请求的客户端)

            OkHttpClient.Builder builder = new OkHttpClient.Builder();//首先拿到创建者
            builder.connectTimeout(30, TimeUnit.SECONDS);
            builder.readTimeout(30, TimeUnit.SECONDS);
            OkHttpClient okHttpClient = builder.build();//由创建者创建OkHttpClient

    2:创建一个RequestBody(请求体:用于存放文件对象和别的参数)

           MultipartBody.Builder builder = new MultipartBody.Builder();//首先拿到创建者

           builder .setType(MediaType.parse("multipart/form-data"));//设置请求体类型
           File file = new File(文件路径);
           String fileType = getMimeType(file.getName());//根据文件的后缀名,获得文件类型
           builder.addFormDataPart("file",file.getName(),RequestBody.create(MediaType.parse(fileType), file));
           builder.addFormDataPart("description", 其他参数); 
           RequestBody requestBody = builder.build(); //由创建者创建RequestBody

    3:创建一个Request(请求对象:用于存放请求地址url和请求体RequestBody)

            Request.Builder builder = new Request.Builder();//首先拿到创建者
            builder.url(url)                                                       //设置请求地址
                    .method("POST", requestBody);               //设置requestBody

            //也可以这样写 :builder.url(url).post(requestBody)

          Request request = builder.build();//由创建者创建OkHttpClient

    4:创建Call(根据OkHttpClient和request创建call,call用于调用函数以发送请求)

         Call call = okHttpClient.newCall(request);

    5:用call调用函数以发送请求

    call.enqueue(失败的回调函数,成功的回调函数);

    注意:第5步是异步请求,关于同步请求和异步请求的区别请看下篇文章

    展开全文
  • 创建OkHttpClient对象 使用构造方法直接创建OkHttpClient OkHttpClient client = new OkHttpClient(); 使用Builder模式创建对象 OkHttpClient.Builder builder = new OkHttpClient.Builder();//先创建构建...

    第一步
    创建OkHttpClient对象

    • 使用构造方法直接创建OkHttpClient
    OkHttpClient client = new OkHttpClient();
    • 使用Builder模式创建对象
    OkHttpClient.Builder builder = new OkHttpClient.Builder();//先创建构建者对象
    builder.connectTimeout(3*1000,TimeUnit.MILLISECONDS);//设置超时时间
    OkHttpClient client = builder.build();//使用构建者创建OkHttpClient对象

    区别

    • 使用Bulider模式创建OkHttpClient对象,先得到Bulider对象,在通过代码创建OkHttpClient,这中间可以根据需要修改Bulider对象的一些字段值
    • 使用构造方法创建OkHttpClient对象则是一步操作,不能更改任何字段值

    第二步
    Request对象的创建
    get请求时创建Request对象的代码如下:

    Request request = new Request.Builder().url("/").build();

    这是一种Builder设计模式,先创建Builder对象,给Builder对象的属性赋值,再用build方法创建Request对象,最后把builder的值赋给Request对象
    在Request的内部类Builder的无参构造源码中默认把Builder的请求方法设置为GET,所以使用get请求不需要再次设置请求方式

    缺少Call对象的创建
    缺少RealCall的execute方法实现同步请求
    缺少RealCall的enqueue方法实现异步请求

    第三步
    讲解Request.Builder类的post方法
    该方法作用是设置post请求的请求体,接收的参数是RequestBody类及子类对象

    • RequestBody类及其核心方法
      1.public abstract MediaType contentType()//数据类型
      2public long contentLength()//数据长度
      3public abstract void writeTo(BufferedSink sink)//写操作

    • RequestBody类的create方法
      重要方法有两个
      1.create(final MediaType contentType,final byte[] content,final int offset,final int byteCount)
      //创建上传byte数据的RequestBody对象
      2.create(final MediaType contentType, final File file)
      //创建上传File数据的RequestBody对象

    第四步
    MultipartBody类
    多重body的类
    既可以上传键值对数据,又可以上传File数据
    微信发朋友圈要上传文字+图片 就可以用到这个
    基本代码

    MultipartBody body = new MultipartBody.Builder()
    .setType(MultipartBody.FORM)
    .addFormDataPart("groupId",""+groupId)//添加键值对参数
    .addFormDataPart("title","title")
    .addFormDataPart("file",file.getName(),RequestBody.create(MediaType.parse("file/"),file))//添加文件

    看addFormDataPart方法

    • addFormDataPart(String name,String value)
      添加键值对数据
    • addFormDataPart(String name,String filename,RequestBody body)
      添加File数据

    添加File数据的流程如下:
    1.将File对象得到body对象
    2.将name和Filename封装到Header对象
    3.将Header对象和body对象传递给part对象,然后将part对象放入Builder的字段parts集合中

    下面演示一次正确的上传文字和图片的代码

    List<MultipartBody.Part> part = null;
     File file = new File(imagUrl);
                    MultipartBody.Builder builder = new MultipartBody.Builder()
                            .setType(MultipartBody.FORM)
                            .addFormDataPart("userId", mId);
                    RequestBody imgBody = RequestBody.create(MediaType.parse("multpart/form-data"), file);
                    builder.addFormDataPart("file", file.getName(), imgBody);
                    part = builder.build().parts();

    ps:用addFormDataPart上传File数据时,需要创建RequestBody对象,所以这里先创建好再传入进去

    分析:
    写给后台的Service

    submitImage(@Part List<MultipartBody.Part> partList);

    传给后台一个MultiPart集合,他们进行解析
    所以安卓端是创建一个List集合传给后台

    展开全文
  • OkHttpClient用法

    2018-07-26 19:13:00
    上传文件及其他参数 File file = new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\test.png"); RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), file); RequestBody ...
  • 这个需求呢,是 从相机相册获取图片上传至服务器 相机相册在这里就不写了 望见谅. 上步骤 上代码 1.第一步导入Ok的依赖库 implementation 'com.squareup.okhttp3:okhttp:3.2.0' 2.相机相册代码略过 3.从...
  • Android 头像上传至服务器 (OkHttpClient请求) 1.导入本章内容要使用的第三方库 implementation 'com.squareup.okhttp3:okhttp:3.12.1' debugImplementation 'com.squareup.okhttp3:logging-interceptor:3.12.1' ...
  • OkHttpClient使用示例

    千次阅读 2016-09-18 09:40:55
    OKHttpClient是一个类似HttpClient的工具,用于模拟Http,https的请求。语法使用方面要比HttpClient更简洁 一. 1、Jar包下载 maven引入: dependency> groupId>com.squareup.okhttpgroupId> artifactId>...
  • 登录注册HttpUtils接口适配器注册登录MainActivityMain2...HttpUtils public class HttpUitls { private static HttpUitls httpUitls = null; private OkHttpClient client; private Handler handler = new Ha...
  • OkhttpClient的使用详解

    万次阅读 多人点赞 2019-06-12 23:34:52
    OkHttpClient是一个高效的HTTP客户端,它有以下默认特性: 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接 连接池减少请求延时 透明的GZIP压缩减少响应数据的大小 缓存响应内容,避免一些完全重复的...
  • okHttpClient的用法

    2017-11-29 20:48:54
    OkHttpClient okHttpClient = new OkHttpClient(); // 创建客户端对象 Request builder = new Request.Builder() .url( path ) // 指定访问路径 .build(); // 提交请求 Call call = okHttpClient....
  • package com.example.mvpdemotwo.modle; import android.util.Log; import android.widget.Toast; import com.example.mvpdemotwo.MainActivity; import java.io.IOException;...import okhttp3.Call; i
  •  OkHttpClient okHttpClient = new OkHttpClient();  //2.创建一个请求的对象....默认就是get方式  Request request = new Request.Builder()  .url("https://www.zhaoapi.cn/ad/getAd")  .build...
  • 我敲好几遍啦才能一分钟完成 ...package fengxing.primer.okhttpclient; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Bitmap; import...
  • 转载:http://www.jianshu.com/p/c478d7a20d03OkHttp可以说是如今最为流行的网络请求框架之一,今天来探究下OkHttp 的使用方法,包括...OkHttpClient:客户端对象Request:访问请求,Post请求中需要包含RequestBody...
  • OkHttpClient官网: http://square.github.io/okhttp/OkHttp GitHub地址:https://github.com/square/okhttp首先导入maven依赖:&lt;dependency&gt; &lt;groupId&gt;com.squareup.okhttp3&lt;/...
  • 使用OkHttpClient 模拟表单提交请求,普通字段加文件上传 一、maven依赖 <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> ...
  • 二次封装OKhttpClient和使用

    千次阅读 2017-09-08 13:59:46
    compile ‘com.squareup.okhttp3:okhttp:3.2.0’2.在创建要工具包和工具类 下面就是二次封装的工具类直接调用即可package com.bwei.okhttp3ps.utils;import android.content.Intent; import androi
  • Android 提供了三种 HTTP client:HttpURLConnection、 HttpClient和OkHttpClient。都支持 HTTPS、流媒体上传和下载、可配置的超时、IPv6 与连接池(connection pooling)。  一、Java.net包中的HttpURLConnection...
  • 1.使用OkHttpClient调用第三方接口 ...import okhttp3.*; import java.io.IOException; /** * http请求 * @author zhouyaoming */ public class HttpClients { private static final OkHttpClient...
  • 为什么okhttpclient不能builder

    千次阅读 2016-12-14 08:38:00
     3  4  5  6  7  8  9  10  11  12  13  14  我们这里是异步的方式去执行,当然也支持阻塞的方式,上面我们也说了Call有一个execute()方法,你也可以直接调用call.execute()通过返回一个Response。  ...
  • okHttpClient--post/get请求

    2018-01-09 18:09:26
    package cgg.com.homework.NetUtil; import android.os.Environment; import java.io.File; import java.util.Map; import java.util.concurrent.TimeUnit;...import okhttp3.Cache; import okhttp3.Call; import o
  • OkHttpClient  client  =   new   OkHttpClient ();   String  run ( String  url )   throws   IOException   {   Request  request  =   new   Request . Builder (). url ( url ). build ()...
  • * post请求上传文件 * 参数1 url * 参数2 回调Callback */ public static void uploadPic(String url, File file, String fileName) { //创建OkHttpClient请求对象 OkHttpClient okHttpClient = ...
  • OkhttpClient的主要作用: 设置读写超时 设置连接超时 设置缓存标志 设置拦截器(重点) Retrofit的主要作用 设置baseUrl 设置client() 这里设置为okhttpCient 设置callAdapterFactory 支持RxJava 设置...
  • 如果要把所有的不同都上传就太多了,所有这里就先放3张图片 在做功能之前,我们应该先把要使用的依赖导入,权限加上 //因为我们要从网上获取数据,所以导入okhttp,然后用gson解析,用glide加载图片 ...
  • 1,OkHttpClient 2,Request 2.1,RequestBody 2.1.1,FormBody 2.1.2,MultipartBody 2.2,Headers Call 同步请求 异步请求 Response 通过上一节 OkHttp3.0(一)-OkHttp的基本使用 ,我们掌握了OkHttp...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,503
精华内容 1,801
关键字:

okhttpclient3上传