精华内容
下载资源
问答
  • OkHttpClient使用和封装

    千次阅读 2018-09-29 10:56:38
    OkHttpClient使用和封装 最近的项目用到了底部弹窗的效果,网上百度了很多类似写好的控件,其中也不乏好的实现。但是为了方便以后扩展,总结了一下前人的经验自己写了实现了一个类: 文章目录 OkHttpClient...

    OkHttpClient使用和封装

    最近的项目用到了底部弹窗的效果,网上百度了很多类似写好的控件,其中也不乏好的实现。但是为了方便以后扩展,总结了一下前人的经验自己写了实现了一个类:



    环境配置

    目前安卓开发者普遍使用AS开发,所以这里只介绍引入依赖的配置方式,同时引入Gson作为后面数据解析的工具。

    implementation 'com.squareup.okhttp3:okhttp:3.2.0'
    implementation 'com.google.code.gson:gson:2.3.1'
    

    引入库以后,需要在AndroidManifest文件中获取网络访问权限

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

    同步GET请求

    //同步GET方法,execute()方法会抛出IOException异常
        private void syncNetAccess() throws IOException {
    
            //创建OkHttpClient实例,主要用于请求网络
            OkHttpClient okHttpClient = new OkHttpClient();
    
            //创建Request实例,可以配置接口地址和请求头
            Request okRequest = new Request.Builder().url("http://toutiao-ali.juheapi.com/toutiao/index?type=caijing").build();
    
            //GET请求,用Response接受相应结果
            Response response = okHttpClient.newCall(okRequest).execute();
    
            //response.body()为请求返回数据 JSON格式
            Log.d("+++++++++++++++++++++",response.body().string();
        }
    

    这里值得注意的一点,response.body()这个方法很奇怪只能获取一次,再调用只能得到null,所以有打印结果习惯的不要入坑。

    另外一个坑就是线程的问题,现在的系统版本不支持在主线程,这样请求的话会报错:NetworkOnMainThreadException。

    解决的办法有两种:一是添加StrictMode约束。

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    

    另外一种就是创建一个新的线程Thread,因为代码比较多,为了不干扰本文的主题在这里就不详说了。

    那么,既然同步请求这么坑爹,为什么不直接使用异步请求呢?

    异步GET请求

     //异步GET方法
        private void asyncNetAccess() throws IOException {
    
            //创建OkHttpClient实例,主要用于请求网络
            OkHttpClient okHttpClient = new OkHttpClient();
    
            //创建Request实例,这里配置了请求头 addHeader()
            Request okRequest = new Request.Builder().url("http://toutiao-ali.juheapi.com/toutiao/index?type=caijing").addHeader("name","value").build();
    
            //GET请求,回调函数中获取相应结果
           okHttpClient.newCall(okRequest).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.d("+++++++++++++++++++++",e.getMessage());
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Log.d("+++++++++++++++++++++",response.body().string());
                }
            });
    
        }
    

    异步请求初始化的方式差不多,只是在最后请求网络的时候改为enqueue()方法,并且创建了一个Callback来异步处理返回的结果,不在需要Response接收。其中,onFailure和onResponse分别是访问失败和成功的回调。

    值得注意的,这里创建Request实例的时候加入了响应头Header,应用场景嘛比如一些公共的接口会需要身份验证,就需要添加响应头。这里是通过addHeader()方法添加key-value值,有点类似Map。

    具体使用:
    addHeader(“name”,“value”) 。当然响应头可以add多次,并且后面也会讲到批量添加的方法。

    异步POST请求

    POST请求也有异步和同步之分,发送请求的时候与GET请求是一样的,在这里不再介绍赘述。参照异步POST请求代码就知道同步代码是什么样的了。

     //异步POST方法
        private void asyncPostAccess() throws IOException {
    
            //创建OkHttpClient实例,主要用于请求网络
            OkHttpClient okHttpClient = new OkHttpClient();
    
            //创建表单请求体
            FormBody.Builder formBody = new FormBody.Builder();
            //传递键值对参数
            formBody.add("name","shuaige");
    
            //创建Request实例,设置POST参数
            Request okRequest = new Request.Builder().url("http://toutiao-ali.juheapi.com/toutiao/index?type=caijing").post(formBody.build()).build();
    
            //POST异步请求,回调函数中获取相应结果
            okHttpClient.newCall(okRequest).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.d("+++++++++++++++++++++",e.getMessage());
                }
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Log.d("+++++++++++++++++++++",response.body().string());
                }
            });
    
        }
    

    FormBody.Builder作为请求参数的创建,配置request时候调用post()方法传入请求参数的同时规定了请求方式,就是这么简单~

    OkHttpUtil工具类封装 让网络请求更轻松

    通过上面的例子我们不难发现,在每次请求网络之前都会创建一个实例:
    OkHttpClient okHttpClient = new OkHttpClient();

    并且每次网络访问都需要
    okHttpClient.newCall() 来实现。

    这显然不符合面向对象的的三要素的要求(更不符合懒蛋程序猿的要求)。作为当之无愧的程序猿,我义无反顾的对网络请求做了一个封装,方便以后其他项目上使用。

    首先创建一个工具类:OkHttpUtil,这里为了节省一下内存我用了单例模式来封装,毕竟网络请求是APP的核心嘛,用的次数不要太多。

    至于单例怎么写本着能省则省态度,以后找一章专门来记录。不多说,下面上代码。

    package com.dzh.goldmarket.util;
    
    import okhttp3.Callback;
    import okhttp3.Headers;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    
    public class OkHttpUtil {
    
        private volatile static OkHttpUtil okHttpUtil = null;
        private static OkHttpClient okHttpClient = null;
    
        public static OkHttpUtil getInstance(){
            if(okHttpUtil == null){
                synchronized (OkHttpUtil.class){
                    if(okHttpUtil == null){
                        okHttpUtil=new OkHttpUtil();
                        if(okHttpClient==null)
                            okHttpClient = new OkHttpClient();
                    }
                }
            }
            return okHttpUtil;
        }
    
        public void doGet(String url, Headers headers, Callback callback){
    
            Request.Builder builder = new Request.Builder().url(url);
            //添加响应头集合
            if(headers!=null)
                builder.headers(headers);
    
            Request okRequest = builder.build();
            okHttpClient.newCall(okRequest).enqueue(callback);
        }
    
        public void doGet(String url, Callback callback){
            this.doGet(url,null,callback);
        }
    
    }
    
    
    

    这里doGet()实现了一个异步GET请求,其中Headers参数是响应头集合,Callback作为回调函数用法跟之前差不多,下面是具体的调用方法:

    private void getNewsList() throws IOException, JSONException {
            String url="http://toutiao-ali.juheapi.com/toutiao/index?type=caijing";
            //name-value格式,可以多个header, 如("name1","value1","name2","value2")
            Headers headers =Headers.of("Authorization","APPCODE vjpawenapasj23sfln3");
            Request okRequest = new Request.Builder().url("http://toutiao-ali.juheapi.com/toutiao/index?type=caijing").addHeader("Authorization","APPCODE 545beb7b4c744411988486b946bca3cd").build();
            OkHttpUtil.getInstance().doGet(url,headers,new Callback(){
    
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.d("+++++++++++++++++++++",e.getMessage());
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    String bodyStr = response.body().string();
    				//Gson解析返回结果
                    newsEntities = new Gson().fromJson(bodyStr, NewsResultEntity.class);
    
                    //多线程,需要在UI线程中更新APP界面
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            newListView.setAdapter(new NewsAdapter(newsEntities.getResult().getData(),getActivity()));
                        }
                    });
                }
            });
    
        }
    

    需要注意一点:异步网络请求是多线程调用的,一般网络请求伴随的就是更新UI界面,所以需要调用runOnUiThread()方法在主线程中更新APP界面。

    OK,使用方法和封装方法到此结束,开发中遇到的坑也一一列举。另外网络请求的一些配置,如超时、缓存等,以后有需要再慢慢补充。

    (督促自己养成编写项目笔记的习惯,留作日后复习使用)

    展开全文
  • 本次来记录下OkHttpClient使用OkHttpClient是用来完成android 客户端对服务端请求的工具。 首先记住,使用网络的时候一定要加入权限,加入到AndroidMainfest.xml中 ”android.permission.INTERNET”> 在初次...
  • OkHttpClient 使用

    2020-10-10 17:27:56
    } public static String postJson(String url, String json) throws IOException { OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create(JSON_, json); Request request =...

    1. pom依赖

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

    2.封装工具方法

    package com.base.core.util;
    
    import java.io.IOException;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    import javax.net.ssl.HostnameVerifier;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSession;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    import okhttp3.FormBody;
    import okhttp3.MediaType;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    
    public class HttpUtil {
    	
    	public static final MediaType JSON_ = MediaType.parse("application/json; charset=utf-8");
    	
    	public static final MediaType TEXT_ = MediaType.parse("text/x-markdown; charset=utf-8");
    	
    	public static String httpGet(String url) throws IOExcepti
    展开全文
  • OKHttpClient使用示例

    千次阅读 2016-10-04 18:34:10
    OKHttpClient是一个类似HttpClient的工具,用于模拟...语法使用方面要比HttpClient更简洁。 1、Jar包下载 maven引入: dependency> groupId>com.squareup.okhttpgroupId> artifactId>okhttpartifactId> versio

    OKHttpClient是一个类似HttpClient的工具,用于模拟Http,https的请求。语法使用方面要比HttpClient更简洁。

    1、Jar包下载

    maven引入:

        <dependency>
          <groupId>com.squareup.okhttp</groupId>
          <artifactId>okhttp</artifactId>
          <version>2.2.0</version>
          <scope>compile</scope>
        </dependency>

    手动下载:

    下载以下jar文件导入工程即可:

    okhttp-2.2.0.jar

    okio-1.2.0.jar

    2、示例代码

    OkHttpClient client = new OkHttpClient();
    
    Request request = new Request.Builder()
    	.url("http://www.baidu.com")
    	.header("User-Agent", "OkHttp Headers.java")
    	.build();
    
    Response response = client.newCall(request).execute();
    
    System.out.println("Result: " + response.isSuccessful());
    System.out.println("Server: " + response.header("Server"));
    System.out.println("ResponseBody: " + response.body().string());

    3、其他功能

    1. 使用 GZIP 压缩减少传输的数据量;
    2. 缓存,减少重复请求;
    3. SPDY;
    4. 连接池;
    5. 失败重试(如果你的服务有多个 IP 地址,如果第一次连接失败,OkHttp 将使备用地址);
    展开全文
  • 本次来记录下OkHttpClient使用OkHttpClient是用来完成android 客户端对服务端请求的工具。 首先记住,使用网络的时候一定要加入权限,加入到AndroidMainfest.xml中 <uses-permission android:name=...

    本次来记录下OkHttpClient的使用,OkHttpClient是用来完成android 客户端对服务端请求的工具。

    首先记住,使用网络的时候一定要加入权限,加入到AndroidMainfest.xml中

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

     

    在初次使用的时候会出现报错。cannot resolve symbol OkHttpClient

    这里需要引入

        implementation 'com.squareup.okhttp3:okhttp:3.0.1'

    然后刷新下项目就可以了。

    代码:

    package com.example.administrator.testclient;
    
    
    import com.squareup.*;
    
    import java.io.IOException;
    
    import okhttp3.FormBody;
    import okhttp3.MediaType;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    
    public  class BaseHttpClient {
    
        public static final MediaType MEDIA_TYPE_MARKDOWN
                = MediaType.parse("text/x-markdown; charset=utf-8");
        // 01. 定义okhttp
        private  final  OkHttpClient client  = new OkHttpClient();
    
        public BaseHttpClient(){
    
            //client.connectTimeoutMillis();
        }
    
    
        /**
         * 发送一个表单请求
         * @throws Exception
         */
        public void SendForm() throws Exception {
            RequestBody formBody = new FormBody.Builder()
                    .add("search", "Jurassic Park")
                    .build();
            Request request = new Request.Builder()
                    .url("https://en.wikipedia.org/w/index.php")
                    .post(formBody)
                    .build();
    
            Response response = client.newCall(request).execute();
            if (!response.isSuccessful())
                throw new IOException("Unexpected code " + response);
    
            System.out.println(response.body().string());
        }
    
        /**POST 请求
         * 发送一个string请求
         * @throws Exception
         */
        public void SendPostString() throws Exception {
            String postBody = ""
                    + "Releases\n"
                    + "--------\n"
                    + "\n"
                    + " * _1.0_ May 6, 2013\n"
                    + " * _1.1_ June 15, 2013\n"
                    + " * _1.2_ August 11, 2013\n";
    
            Request request = new Request.Builder()
                    .url("https://api.github.com/markdown/raw")
                    .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody))
                    .build();
    
            Response response = client.newCall(request).execute();
            if (!response.isSuccessful())
                throw new IOException("Unexpected code " + response);
    
            System.out.println(response.body().string());
        }
    
        /**POST 请求
         * 发送一个From请求
         * @throws Exception
         */
        public   void SendPostFrom() throws Exception {
    
            RequestBody body = new FormBody.Builder()
                    .add("name", "sy")//添加参数体
                    .add("age", "18")
                    .build();
    
            Request request = new Request.Builder()
                    .post(body) //请求参数
                    .url("http://123.207.70.54:8080/SpringMvc/hello")
                    .build();
    
            Response response = client.newCall(request).execute();
            if (!response.isSuccessful())
                throw new IOException("Unexpected code " + response);
        }
    
        /**Get请求
         * 发送一个From请求
         * @throws Exception
         */
        public void SendGetFrom() throws Exception {
    
            Request request = new Request.Builder()
                    .get() //请求参数
                    .url("http://123.207.70.54:8080/SpringMvc/hello")
                    .build();
    
            Response response = client.newCall(request).execute();
            if (!response.isSuccessful())
                throw new IOException("Unexpected code " + response);
        }
    
    }

     测试发现,上面的用不了,下面放一个测试通过的方法:

        public void getDatasyncFactory(){
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
                                Request request = new Request.Builder()
                                        .url("http://123.207.70.54:8080/SpringMvc/hello")//请求接口。如果需要传参拼接到接口后面。
                                        .build();//创建Request 对象
                                Response response = null;
                                response = client.newCall(request).execute();//得到Response 对象
                                if (response.isSuccessful()) {
                                    Log.d("kwwl","response.code()=="+response.code());
                                    Log.d("kwwl","response.message()=="+response.message());
                                    Log.d("kwwl","res=="+response.body());
                                    //此时的代码执行在子线程,修改UI的操作请使用handler跳转到UI线程。
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }).start();
                }

    返回信息:

     

    转载于:https://www.cnblogs.com/sunxun/p/9279966.html

    展开全文
  • okhttpclient使用指南

    千次阅读 2019-03-02 10:33:57
    https://blog.csdn.net/u013651026/article/details/79738059 https://blog.csdn.net/dingshuhong_/article/details/80335499
  • OkHttpClient使用示例

    千次阅读 2016-09-18 09:40:55
    OKHttpClient是一个类似HttpClient的工具,用于模拟...语法使用方面要比HttpClient更简洁 一. 1、Jar包下载 maven引入: dependency> groupId>com.squareup.okhttpgroupId> artifactId>okhttpartifactId> v
  • OkhttpClient使用详解

    万次阅读 多人点赞 2019-06-12 23:34:52
    HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。OkHttpClient是一个高效的HTTP客户端,它有以下默认特性: 支持HTTP/2,允许所有同一个主机地址的请求共享同一个...
  • OkHttp官方文档并不建议我们创建多个OkHttpClient,因此全局使用一个。 如果有需要,可以使用clone方法,再进行自定义。这点在后面的高级教程里会提到。 enqueue为OkHttp提供的异步方法,入门教程中并没有...
  • public class HttpUtils {  private static final String TAG = "HttpUtils";  private static volatile HttpUtils instance;  public Handler handler = new ... private OkHttpClient client;...
  • OkHttpClient post的使用

    千次阅读 2017-11-29 14:30:39
    OkHttpClient okHttpClient=new OkHttpClient(); FormBody formboby=new FormBody.Builder() .add("mobile", "15715317583") .add("password", "123456") .build(); Request builder = new Request
  • OkHttpClient使用相关

    千次阅读 2016-09-18 20:46:26
    ... ...关于HttpURLConnection和HttpClient的选择>>官方博客 ...尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比HttpClient实在是太难用,太弱爆了。 OkHttp是一个相对成
  • 使用OkHttpClient的GET方式

    千次阅读 2017-08-28 21:39:59
    前面我们学过两种数据传输协议了,现在开始学习第三种:OkHttpClient 2 . 需求:得到响应信息 3 . 步骤: 3-1. 创建okhttp客户端对象 3-2. request 默认是get请求 3-3. 进行请求操作 3-4. 判断是否请求成功...
  • kotlin中OKhttp的使用OkHttpClient()

    千次阅读 2019-09-27 10:23:03
    kotlin中OKhttp的使用OkHttpClient() fun getDataByGet(): Int { try { val client = OkHttpClient() val request = Request.Builder().get() .url("你的url") ...
  • public void get(String uri){ OkHttpClient client = new OkHttpClient(); Request build = new Request.Builder().url(uri).build(); Call call = client.newCall(build); call.enqueue(new Callb
  • HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。OkHttp是一个高效的HTTP客户端,它有以下默认特性: (1)支持HTTP/2,允许所有同一个主机地址的请求共享同一个...
  • 因为新系统用的是spring cloud这一套,调用其他服务使用的是feign的形式,找了一圈没有找到合适的方案,于是用OkHttpClient来处理了,这里做个记录。(仍相信feign也能处理,但是刚上手spring cloud,很多都还不是很...
  • 安卓使用OkHttpClient进行网络请求

    千次阅读 2016-05-13 00:02:40
    可以通过OkHttpClient减少代码量,源码为https://github.com/square/okhttpOkHttpClient的使用非常简单,也可以分为同步和异步两种。同步(Synchronous Get)首先引入Okhttpclient的依赖包compile '...
  • 关于OkHttpClient的用法

    2018-11-27 20:16:06
    https://blog.csdn.net/mazaiting/article/details/78129542
  • OkHttpClient依赖架包

    2018-07-16 15:07:42
    okhttp_3.2.0的jar包,在eclipse和Android studio下使用okhttp需要依赖的jar包,同时也包含了使用okhttp需要依附的okio架包
  • OkHttpClient okHttpClient = new OkHttpClient ( ) ; //创建请求方式 Request request = new Request . Builder ( ) . url ( url ) . build ( ) ; //执行请求 Call call = okHttpClient . ...
  • 使用 MockWebServerRule 测试 OkHttpClient。 @RunWith ( RobolectricTestRunner . class) public class ItemObservableTest { @Module ( injects = ItemObservableTest . class, includes = AppModule . class...
  • OkHttpClient同步下载文件与访问http

    千次阅读 2018-12-10 17:16:59
    笔记,使用ok http下载文件版本为3.1 public class DownUtil { private Logger logger = LoggerFactory.getLogger(this.getClass... private OkHttpClient okHttpClient; private boolean canDownLoad = true; ...
  • OkHttpClient使用方法

    千次阅读 2018-03-22 14:31:49
    参考资料 https://github.com/square/okhttp/wiki ... 使用方法 get // 获取OkHttpClient private final OkHttpClient client = new OkHttpClient(); // 执行方法 public void r...
  • OKhttpClient 简单使用总结

    千次阅读 2017-12-21 15:07:33
    http优化,由httpClient改为OKHttpClient,研究了一下,网上资料不多大部分是安卓的,就着httpClient的入参简单写了一个公共方法,因为上一层使用了hystrix,就没有使用异步调用。后期看业务需要增加OKHttp的拦截和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,154
精华内容 6,861
关键字:

okhttpclient使用