您的位置:首页 > 理论基础 > 计算机网络

Android网络访问之http、https、 cookie的使用

2015-11-03 11:59 459 查看
最近公司做一个游戏SDK,只有我一个人做~~~~~~~~,以前也没做过这个,起初感觉无从下手,前前后后花了大概4周的时间,与第一家厂家对接完成的时候,总算松了口气。项目中的网络模块,从http开始调通,然后加上cookie,最后换成https,感觉显目的大半时间都花在这里,下面把这一块的知识总结一下,希望对正在看文章的你有一定的帮助~~

Google对安卓网络访问这块有一个专门的类:UrlConnection,这个是网络访问类的超类,一般在使用中都是转化为针对http协议封装的HttpURLConnection类。http协议包括10几种请求方式,常用的方式为Post、Get,所谓请求方式是客户端与服务器建立连接的时候告诉服务器客户端想要干什么,比如Get请求就是从服务器获取数据,POST可以往服务器上传数据。https是包含SSL连接的http,一般使用方式和http一样,如果需要https证书,需要在建立连接的时候上传证书到服务器,之后就和http一样了。cookie和session其实都是在头部包含一串特殊的字符串,其一般为一个键值对,作用为区分不同的客户端,使用步骤一般是:服务器在响应头返回cookie,客户端取出cookie在下一次访问服务器的时候再请求头带上cookie,这样服务器就可以知道这次请求是哪个客户端建立的了(http连接是无状态的,也就是说服务器在建立连接的时候并不知道是哪个客户端要求建立的)。下面就对这一块知识做一个简单的介绍。

Http之Get请求:

Get请求的缺点是只能携带2K内的数据,并且可以看见携带的数据,不安全。优点就是方便。

请求示例:

HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
// 参数设置
conn.setReadTimeout(5 * 1000);
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("GET");
// 判断响应码
if (conn.getResponseCode() == 200) 
//获取到返回的输入流,用流的方式去处理返回的数据<span style="white-space:pre">						</span>
InputStream is = conn.getInputStream();


是不是感觉特别简单呢~~~~~~~

Http之POST请求:

POST请求可以在建立连接的时候上传数据到服务器,数据已表格的形式上传,保证了数据的安全性。

请求示例:

HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
// 参数设置
conn.setReadTimeout(5 * 1000);
conn.setConnectTimeout(5 * 1000);
<span style="color:#ff0000;">conn.setRequestMethod("POST");</span>
// 打开输出流,往服务器发送数据,默认为关闭状态
conn.setDoOutput(true);
// 写入的数据
<span style="color:#ff0000;">conn.getOutputStream().write(params.getBytes());
conn.getOutputStream().flush();
conn.getOutputStream().close();</span>
// 判断响应码
if (conn.getResponseCode() == 200) 
<span style="white-space:pre">	</span>InputStream is = conn.getInputStream();


除了红色的部分不一样外其余的都和Get请求一样,是不是感觉也挺简单的呢~~~~~~~·

带cookie的http:

判断服务器返回的的头部信息是否有cookie,如果有,下次请求带上cookie。

示例代码:

HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
<span style="white-space:pre">			<span style="color:#ff0000;">		</span></span><span style="color:#ff0000;">//判断cookie是否为空
					if (responseCookie != null) {
						conn.addRequestProperty("Cookie", responseCookie);
				
					}</span>
					// 参数设置
					conn.setReadTimeout(5 * 1000);
					conn.setConnectTimeout(5 * 1000);
					conn.setRequestMethod("POST");
					// 打开输出流,往服务器发送数据,默认为关闭状态
					conn.setDoOutput(true);
					// 写入的数据
					conn.getOutputStream().write(params.getBytes());
					conn.getOutputStream().flush();
					conn.getOutputStream().close();
	<span style="color:#ff0000;">				//获取到cookie
					List<String> cookies = conn.getHeaderFields().get("Set-Cookie");
					//把cookie得到之后取出里面的值,然后保存到一个字符串里面,请求的时候带过去</span>
				<span style="color:#ff0000;">	for (String cookie : cookies) {
						responseCookie = cookie.split(";")[0];
						responseCookie = responseCookie.split("\\.")[0];

					}</span>
<span style="white-space:pre">					</span>// 判断响应码
<span style="white-space:pre">					</span>if (conn.getResponseCode() == 200) 
<span style="white-space:pre">						</span>InputStream is = conn.getInputStream()


其中红色的部分就是处理cookie的代码,别的和上面的是一样的,那么说了这么多,cookie到底是什么样的呢?我在网上找了一个:Set-Cookie:customer=huangxp;
path=/foo; domain=.ibm.com; ,其中红色的部分就是cookie的具体内容,别的是一些路径域名上面的,不需要管,只要下次在建立连接的时候带上红色的部分cookie问题就可以解决了~~~~~~~~····ok

https连接:

轮到https了,~~~~~~~~~~~~~,判断一个连接是http连接还是https连接最简单的方式就是直接看地址,如果以https开头的就是https连接,以http开头的就是http协议。下面的代码是需要证书连接的情况下的:

1.将url连接强转为httpsUrlconnection像这样:httpConn = (HttpsURLConnection) urlObj.openConnection();

2.得到一个SSLSocketFactory类

3.将连接设置SSLSocketFactory像这样:httpConn.setSSLSocketFactory(socketFactory);

有没有一种很简单的感觉~~~~~~····

那么SSLSocketFactory如何得到呢?看代码:

KeyStore ks = KeyStore.getInstance("PKCS12");
			<span style="color:#ff0000;">InputStream ksIs = context.getResources().getAssets()
					.open("client.p12");</span>
			ks.load(ksIs, "123456".toCharArray());
			ksIs.close();

			KeyStore ts = KeyStore.getInstance("bks");
			<span style="color:#ff0000;">InputStream tsIs = context.getResources().getAssets()
					.open("client.truststore");</span>
			ts.load(tsIs, "123456".toCharArray());
			tsIs.close();

			KeyManagerFactory kmf = KeyManagerFactory
					.getInstance(KeyManagerFactory.getDefaultAlgorithm());
			kmf.init(ks, "123456".toCharArray());

			TrustManagerFactory tmf = TrustManagerFactory
					.getInstance(TrustManagerFactory.getDefaultAlgorithm());
			tmf.init(ts);

			SSLContext ctx = SSLContext.getInstance("SSL");
			ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(),
					new SecureRandom());
			SSLSocketFactory socketFactory = ctx.getSocketFactory();
			return socketFactory;


也不多啰嗦了,说多了到底还不会用了 ,你直接拷贝上面的代码,把红色的部分改成后台给你的两个证书的名字就ok~~,对了,记得把两个证书放在asserts文件夹下面哦~~~~

最后把整个工具类提供给大家下载吧,功能有点强大,支持重定向,一般参数传进去就可以的到结果啦~~~~

资源下载

好了,网络访问算总结了一下了,写的不是很详细,大致的串了一遍。写这个出了一点点意外~~~~~~就是写了一半出去吃了个饭,回来不小心把浏览器关了~~~~~查看了下草稿箱发现没有给我自动保存~~~~~无语,你现在看见的是我后面又敲出来的~~~~~~~╮(╯▽╰)╭,希望这篇文章对你有帮助,有什么问题欢迎给我留言,欢迎指出不对的地方~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: