版权声明:本文为HaiyuKing原创文章,转载请注明出处!
前言
本文使用的OKHttp封装库是张鸿洋(鸿神)写的,因为在项目中一直使用这个库,所以对于一些常用的请求方式都验证过,所以特此整理下。
本文主要讲的是在项目中导入OkHttpUtils库的一些操作。至于get、post、上传单个、多个文件、下载文件、提交文件、提交json字符串请求等,在下一篇中会有单独的介绍。
效果图
代码分析
1、导入jar包
2、在MyApplication中配置OKHttpUtils
3、在AndroidManifest.xml中添加权限并声明自定义的MyApplication
4、创建urls.xml文件,用来设置URL地址【这种方式不太好,因为urls.xml在res中,所以容易被反编译获取到;应该换成在接口ServerApi中声明常量进行调用】
5、创建logic包,用来封装网络请求
6、在strings.xml文件中声明一些常用的提示语
使用步骤
一、项目组织结构图
注意事项:
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
其中,gson-2.2.4.jar用于Post Json提交。【这个是必须单独引用的,不管Android studio还是eclipse】
同步Gradle File后:
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(); } } }