如果客户端的业务是与host绑定的,比如是绑定了host的http服务或者是cdn的服务,那么在用HTTPDNS返回的IP替换掉URL中的域名以后,还需要指定下Http头的Host字段。以curl为例,假设你要访问www.qq.com,通过HTTPDNS解析出来的IP为192.168.0.111,那么通过这个方式来调用即可: curl -H "Host:www.qq.com" http://192.168.0.111/aaa.txt.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<!-- 添加应用自身的灯塔appkey,如0I3002SDUA14CRW8-->
<meta-data
android:name="APPKEY_DENGTA"
android:value="XXXXXXXXXXXXXXXX" />
<!-- DNS接收网络切换广播 -->
<receiver
android:name="com.tencent.msdk.dns.HttpDnsCache$ConnectivityChangeReceiver"
android:label="NetworkConnection" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
修改项 | 修改字段 | 修改方法 |
---|---|---|
厂商开关 | IS_COOPERATOR | 腾讯外部应用填"true"腾讯内部应用填"false" |
厂商上报appID | COOPERATOR_APPID | key_android.txt文件中的appkey的值,如果是内部应用接入了MSDK的,可以不填 |
SDK日志开关 | IS_DEBUG | true为打开日志开关,false为关闭日志 |
服务端分配的ID | DNS_ID | key_android.txt对应的值 |
服务端分配的KEY | DNS_KEY | key_android.txt对应的值 |
###(注意:检查应用是否接入过已经接入了腾讯msdk,如果已经接入了腾讯msdk则忽略此步)
/** ##* 初始化HttpDns ###* @param context 传入Application Context ###*/
###/** ##* 初始化灯塔 ###注意:如果已接入腾讯msdk并且初始化了msdk,则不用再次初始化灯塔 ### @param this 传入主Activity或者Application Context ###*/
###/** ##* HttpDns同步解析接口 ###* 注意:domain只能传入域名不能传入IP,返回结果需要做非空判断 ###* 首先查询缓存,若存在则返回结果,若不存在则进行同步域名解析请求, ###* 解析完成返回最新解析结果,若解析失败返回空对象 ###* @param domain 域名(如www.qq.com) ###* @return 域名对应的解析IP结果集合 ###*/ ###String ips = MSDKDnsResolver.getInstance(). getAddrByName(domain);
3.2 建议调用HttpDns同步接口时最好在子线程调用,getAddrByName(domain)接口做了超时管理,超时时间由应用自己在dnsconfig.ini文件中配置,默认超时时间为3秒(TIME_OUT=3000)。
###例如:
###(1)先初始化HttpDns和灯塔接口: ###注意:若已接入msdk或则单独接入了腾讯灯塔则不用初始化灯塔。
###private static AndroidJavaObject m_dnsJo;
###(2)调用HttpDns接口解析域名: ###// 该操作建议在子线程中处理
###public static string GetHttpDnsIP( string strUrl ) {
}
###原理: ###Android原生系统提供了系统API以实现WebView中的网络请求拦截与自定义逻辑注入,我们可以通过上述拦截WebView的各类网络请求,截取URL请求的host,然后调用HttpDns解析该host,通过得到的ip组成新的URL来请求网络地址。 ###实现方法:
###WebSettings webSettings = mWebView.getSettings(); ###// 使用默认的缓存策略,cache没有过期就用cache ###webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); ###// 加载网页图片资源 ###webSettings.setBlockNetworkImage(false); ###// 支持JavaScript脚本 ###webSettings.setJavaScriptEnabled(true); ###// 支持缩放 ###webSettings.setSupportZoom(true); ###mWebView.setWebViewClient(new WebViewClient() { ###// API 21及之后使用此方法 ###@SuppressLint("NewApi") ###@Override ###public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { ###if (request != null && request.getUrl() != null && request.getMethod().equalsIgnoreCase("get")) { ###String scheme = request.getUrl().getScheme().trim(); ###String url = request.getUrl().toString(); ###Logger.d("url a: " + url); ###// HttpDns解析css文件的网络请求及图片请求 ###if ((scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")) ###&& (url.contains(".css") || url.endsWith(".png") || url.endsWith(".jpg") || url .endsWith(".jif"))) { ###try { ###URL oldUrl = new URL(url); ###URLConnection connection = oldUrl.openConnection(); ###// 获取HttpDns域名解析结果 ###String ips = MSDKDnsResolver.getInstance().getAddrByName(oldUrl.getHost()); ###if (ips != null) { // 通过HTTPDNS获取IP成功,进行URL替换和HOST头设置 ###Logger.d("HttpDns ips are: " + ips + " for host: " + oldUrl.getHost()); ###String ip; ###if (ips.contains(";")) { ###ip = ips.substring(0, ips.indexOf(";")); ###} else { ###ip = ips; ###} ###String newUrl = url.replaceFirst(oldUrl.getHost(), ip); ###Logger.d("newUrl a is: " + newUrl); ###connection = (HttpURLConnection) new URL(newUrl).openConnection(); // 设置HTTP请求头Host域 ###connection.setRequestProperty("Host", oldUrl.getHost()); ###} ###Logger.d("ContentType a: " + connection.getContentType()); ###return new WebResourceResponse("text/css", "UTF-8", connection.getInputStream()); ###} catch (MalformedURLException e) { ###e.printStackTrace(); ###} catch (IOException e) { ###e.printStackTrace(); ###} ###} ###} ###return null; ###} ###// API 11至API20使用此方法 ###public WebResourceResponse shouldInterceptRequest(WebView view, String url) { ###if (!TextUtils.isEmpty(url) && Uri.parse(url).getScheme() != null) { ###String scheme = Uri.parse(url).getScheme().trim(); ###Logger.d("url b: " + url); ###// HttpDns解析css文件的网络请求及图片请求 ###if ((scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")) ###&& (url.contains(".css") || url.endsWith(".png") || url.endsWith(".jpg") || url ###.endsWith(".jif"))) { ###try { ###URL oldUrl = new URL(url); ###URLConnection connection = oldUrl.openConnection(); ###// 获取HttpDns域名解析结果 ###String ips = MSDKDnsResolver.getInstance().getAddrByName(oldUrl.getHost()); ###if (ips != null) { ###// 通过HTTPDNS获取IP成功,进行URL替换和HOST头设置 ###Logger.d("HttpDns ips are: " + ips + " for host: " + oldUrl.getHost()); ###String ip; ###if (ips.contains(";")) { ###ip = ips.substring(0, ips.indexOf(";")); ###} else { ###ip = ips; ###} ###String newUrl = url.replaceFirst(oldUrl.getHost(), ip); ###Logger.d("newUrl b is: " + newUrl); ###connection = (HttpURLConnection) new URL(newUrl).openConnection(); ###// 设置HTTP请求头Host域 ###connection.setRequestProperty("Host", oldUrl.getHost()); ###} ###Logger.d("ContentType b: " + connection.getContentType()); ###return new WebResourceResponse("text/css", "UTF-8", connection.getInputStream()); ###} catch (MalformedURLException e) { ###e.printStackTrace(); ###} catch (IOException e) { ###e.printStackTrace(); ###} ###} ###} ###return null; ###} ###}); ###// 加载web资源 ###mWebView.loadUrl(targetUrl); ###}