版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

本文使用的OKHttp封装库是张鸿洋(鸿神)写的,因为在项目中一直使用这个库,所以对于一些常用的请求方式都验证过,所以特此整理下。

本文主要讲的是在项目中导入OkHttpUtils库的一些操作。至于get、post、上传单个、多个文件、下载文件、提交文件、提交json字符串请求等,在下一篇中会有单独的介绍。

效果图

okhttputils【 Android 一个改善的okHttp封装库】使用(一)

代码分析

1、导入jar包

2、在MyApplication中配置OKHttpUtils

3、在AndroidManifest.xml中添加权限并声明自定义的MyApplication

4、创建urls.xml文件,用来设置URL地址【这种方式不太好,因为urls.xml在res中,所以容易被反编译获取到;应该换成在接口ServerApi中声明常量进行调用

5、创建logic包,用来封装网络请求

6、在strings.xml文件中声明一些常用的提示语

使用步骤

一、项目组织结构图

okhttputils【 Android 一个改善的okHttp封装库】使用(一)

okhttputils【 Android 一个改善的okHttp封装库】使用(一)

注意事项:

1、导入类文件后需要change包名以及重新import R文件路径

2、Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

1、将相关jar包复制到项目的libs目录下并同步Gradle File【这个是eclipse上的用法】【Android studio中直接使用compile 'com.zhy:okhttputils:2.6.2'

jar包下载地址:链接:https://pan.baidu.com/s/1AL4zYlgydc2dJ3A9dy4vaA 密码:4gmh

okhttputils【 Android 一个改善的okHttp封装库】使用(一)

其中,gson-2.2.4.jar用于Post Json提交。【这个是必须单独引用的,不管Android studio还是eclipse】

同步Gradle File后:

okhttputils【 Android 一个改善的okHttp封装库】使用(一)

2、创建一个包含以下代码的MyApplication.java(自定义的Application子类)

package com.why.project.okhttputilsbasedemo;

import android.app.Application;
import android.content.Context;

import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.cookie.CookieJarImpl;
import com.zhy.http.okhttp.cookie.store.PersistentCookieStore;
import com.zhy.http.okhttp.https.HttpsUtils;
import com.zhy.http.okhttp.log.LoggerInterceptor;

import java.util.concurrent.TimeUnit;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;

import okhttp3.OkHttpClient;

/**
 * Created by HaiyuKing
 * Used 自定义Application
 */

public class MyApplication extends Application{

    /**系统上下文*/
    private static Context mAppContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mAppContext = getApplicationContext();

        initOkHttp();//配置OkhttpClient
    }

    /**获取系统上下文:用于ToastUtil类*/
    public static Context getAppContext()
    {
        return mAppContext;
    }

    /**
     * 配置OkhttpClient
     */
    private void initOkHttp() {

        CookieJarImpl cookieJar = new CookieJarImpl(new PersistentCookieStore(getApplicationContext()));//修改成自带的cookie持久化,可以解决程序崩溃时返回到
        //ClearableCookieJar cookieJar1 = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(getApplicationContext()));

        HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);//设置可访问所有的https网站

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(60000L, TimeUnit.MILLISECONDS)
                .readTimeout(60000L, TimeUnit.MILLISECONDS)
                //配置Log,通过设置拦截器实现,框架中提供了一个LoggerInterceptor,当然你可以自行实现一个Interceptor
                .addInterceptor(new LoggerInterceptor("TAG"))
                //配置持久化Cookie(包含Session)
                .cookieJar(cookieJar)
                .hostnameVerifier(new HostnameVerifier()
                {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        // TODO Auto-generated method stub
                        return false;
                    }
                })
                //配置Https
                .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)
                .build();
        OkHttpUtils.initClient(okHttpClient);
    }

}

3、在AndroidManifest.xml中添加权限并声明这个MyApplication

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.why.project.okhttputilsbasedemo">

    <!-- ======================授权访问网络(OkHttpUtil)========================== -->
    <!-- 允许程序打开网络套接字 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- 允许程序访问有关GSM网络信息 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 允许程序访问Wi-Fi网络状态信息 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 允许一个程序访问精良位置(如GPS)  -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- 访问电话状态 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- 允许程序写入外部存储,如SD卡上写文件 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!-- 允许程序读外部存储,如SD卡上读文件 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <!-- ======================授权访问网络(HttpUtil)========================== -->
    <!-- 允许程序打开网络套接字 -->
    <!--<uses-permission android:name="android.permission.INTERNET"/>-->
    <!-- 允许程序访问有关GSM网络信息 -->
    <!--<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />-->
    <!-- 允许程序访问Wi-Fi网络状态信息 -->
    <!--<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />-->
    <!-- 允许一个程序访问精良位置(如GPS)  -->
    <!--<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />-->
    <!-- 访问电话状态 -->
    <!--<uses-permission android:name="android.permission.READ_PHONE_STATE" />-->

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:name=".MyApplication">
        <activity android:name=".activity.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

4、添加运行时权限的处理(本demo中采用的是修改targetSDKVersion=22)

5、将urls.xml文件复制到项目的res/valus目录中【存在反编译的风险,舍弃不用了;这里留作记录,后续不再保留这个文件】

<?xml version="1.0" encoding="utf-8"?>
<!-- 所有接口的url地址 -->
<resources>
    
    <!-- 域名(开发环境) -->
    <string name="server_url">http://www.weather.com.cn/data/sk/</string>
    <!-- 域名(测试环境) -->
    <!-- <string name="server_url"></string> -->
    <!-- 域名(正式环境) -->
    <!-- <string name="server_url"></string> -->

    <!-- get请求地址 -->
    <string name="get_url">101010100.html</string>

</resources>

5、将ServerApi文件复制到项目中

package com.why.project.okhttputilsbasedemo.logic;

/**
 * Created by HaiyuKing
 * Used 接口地址
 */

public interface ServerApi {

    String SERVER_URL = "http://www.weather.com.cn/data/sk/";// 域名(开发环境)
    String GET_URL = "101010100.html";// get请求地址

}

6、将BaseLogic.java、LoginLogic.java复制到项目中

package com.why.project.okhttputilsbasedemo.logic;

import android.content.Context;

import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.cookie.CookieJarImpl;
import com.zhy.http.okhttp.cookie.store.CookieStore;

import java.util.List;

import okhttp3.Cookie;
import okhttp3.CookieJar;

public class BaseLogic {

    protected Context context;
    public final String charset = "GBK";//例如:URLEncoder.encode("中途结束", charset)
    
    /**拼接完整的URL地址*/
    protected String getSpcyUrl(String serverUrl){
        String url = ServerApi.SERVER_URL + serverUrl;
        return url;
    }

    /**获取cookies*/
    public static String getCookiesStr(){
        String cookiesInfo = "";
        CookieJar cookieJar = OkHttpUtils.getInstance().getOkHttpClient().cookieJar();
        if (cookieJar instanceof CookieJarImpl)
        {
            CookieStore cookieStore = ((CookieJarImpl) cookieJar).getCookieStore();
            List<Cookie> cookies = cookieStore.getCookies();
            for(Cookie cookie : cookies){
                cookiesInfo = cookiesInfo + cookie.name() + ":" + cookie.value() + ";";
            }
        }

        return cookiesInfo;
    }

    /**清空cookie缓存*/
    public static void clearCookies()
    {
        CookieJar cookieJar = OkHttpUtils.getInstance().getOkHttpClient().cookieJar();
        if (cookieJar instanceof CookieJarImpl)
        {
            ((CookieJarImpl) cookieJar).getCookieStore().removeAll();
        }
    }

}
BaseLogic.java

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-05-26
  • 2021-12-17
  • 2021-09-24
  • 2021-08-05
  • 2021-12-11
  • 2022-12-23
猜你喜欢
  • 2022-03-03
  • 2021-06-29
  • 2021-08-11
  • 2022-12-23
  • 2021-07-12
  • 2022-12-23
  • 2022-01-17
相关资源
相似解决方案