iPhone网络编程–一起来做网站客户端(一)
在Cocoachina潜水这么久,学到了很多东西。但是从来没有发过贴,真是愧疚。
最近几天一直在学习iphone的网络编程,希望在没有api的情况下,做一个oa系统 的客户端,
所以认真的学习了一下http协议,以及如何发送请求包到服务器以及建立session会话等等
然后总结了一篇文章,费了我不少时间,在此和大家一起分享。因为我觉得网上这方面的资料不是很多
我把正文贴在这里,但是格式上不是很好,详细和完整的总结还是看我的原文吧:http://www.pan-apps.com/?p=281
=================正文========================================
最近几天,一直在学习网络编程方面,我觉得这是移动开发必须了解的知识吧
在实践中学习,才是最好的方法
于是就决定为公司OA系统做一个iphone客户端,但是前提是这个系统没有提供任何API,所以只能悲剧的通过抓包的形式分析,然后模拟发送请求的数据包,以达到访问系统的效果
其实这样的形式就相当于用程序去实现浏览器的功能,但这正是我要学习的网络编程
=======================================================
预备:
首先要了解访问服务器时,计算机到底做了些什么,
那么就要认真学习一下http协议:深入理解HTML协议,这篇非常详细非常好
还有:Http协议详解,HTTP协议实体的基本讲解
请求数据包的讲解可以看这里:http以post方式上传一个文件,构造其请求头和消息报文
认真看了这几篇之后,应该基本上对http协议,和访问服务器的原理有了一点理解了吧
当然,在iPhone网络开发上,很多人都用ASIHttp这个第三方库,使用非常方便,我也用这个库,因为iphone的网络api实在是太麻烦,
可以先学习一下:ASIHTTPRequest 详解, http 请求终结者
======================================================
开始
有了这些网络的知识后,就开始准备做客户端了
公司OA系统网址:http://218.0.4.4:8080/esoa
每个员工登入OA都需要账号和密码,那么想做客户端,那必须等先登入系统,然后才能访问个人页面。
那么,这里就需要解决两个问题:
首先,用浏览器登入系统,在登入界面输入账号密码,浏览器就通过post请求(还有get请求等等),把这个请求数据包发送到服务器,称做request,然后服务器接受后,确认账号密码没错,就建立连接,叫做Session,然后返回响应数据包(response),在响应头里有set-Cookie,告诉客户端jseessionId,这个jsessionId,是刚建立的session会话的唯一标示符,服务器的session里面可能记录我的账号信息,所以只要告诉服务器jsessionid,服务器就知道谁登入了系统,只要这个会话没有失效,那么这次连接就一直保持。
然后访问个人页面时,在访问请求(request)中会带上cookie,这个cookie中会带上这个jseeionId,这样,就告诉服务器是哪个session,服务器就知道我已经登入了,可以访问我的个人页面。
大概思路是这样,本人初学,不对地方请指正:www.pan-apps.com
下面分析时,会实例抓包讲解
=====================================================
分析
首先要解决第一个问题,如何登入。通过基础的学习,知道了这个过程其实
就是跟服务器建立连接,在创建session会话,但是前提是提交账号密码,验证成功。
那么没有api的情况下,就先分析一下登入页面:
查看登入界面的源代码(右击页面就有),看到了登入的表单信息:
<form action=”/esoa/login.do” method=”post” onSubmit=”return validateForm(this);”>
<input name=”username” style=”width: 150px;” class=”text” type=”text” value=”">
<input name=”password” style=”width: 150px” class=”password” type=”password”>
也就是说,登入时,这个页面会把用户名和密码以post请求的方式,发送给服务器,然后”/esoa/login.do”,这个页面进行处理账号密码。
此时,我也抓过包,一开始用的是IE9的开发工具,超郁闷的。提交账号密码登入后,页面会跳转到首页,而这个IE9的工具,只能显示当前页面的请求包的情况,之前登入的post包就不显示了,超郁闷的,迷惑了我很久,所以还是用其他抓包工具吧。
通过抓包,我看到了:点击登入之后,浏览器发送了一个post请求,然后服务器返回response,在response header中有set-cookie字段,里面内容为jsessionId=AESG23421DF…,这样子,服务器就把建立的session会话的标示Id保存在浏览器的cookie里面,然后浏览器请求其他页面时,就会向服务器发送带有jsessionId的cookie,告诉服务器这是哪个会话。
========================================================
代码实现
要模拟这个登入,现在有两种方法:
而在本例中,完全可以通过ASIHTTP的api来操作,可以用ASIFormDataRequest实现post请求,非常方便,主要实现代码如下(具体代码请在文末下载源码,查看):
这样就完成了post请求
然后获得响应头(response header),里面看到
![](http://www.pan-apps.com/wp-content/uploads/2012/03/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7-2012-03-31-%E4%B8%8B%E5%8D%884.09.13.png)
图中可见,通过Set-Cookie 将jsesssionId告诉了客户端,于是我便把这个jsessionId取出来,存在本地。下次访问个人页面时需要用到。
我为什么这么肯定已经登入了呢?是因为我已经在response body中看到了具体的信息:
![](http://www.pan-apps.com/wp-content/uploads/2012/03/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7-2012-03-31-%E4%B8%8B%E5%8D%884.19.04.png)
这样就完成了登入这块内容。
==========================================================
然后就是第二个问题,访问我的个人首页,当然这需要在前面登入的基础上完成
分析
现在访问个人首页,这个不需要上传什么数据,只要登入后就可以访问,那么这个肯定是一个GET请求,这样就先抓个包来看看
由于IE的开发工具方便,暂时先用这个抓包,如下:
![](http://www.pan-apps.com/wp-content/uploads/2012/03/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7-2012-03-31-%E4%B8%8B%E5%8D%884.42.24.png)
由此可看出与服务器建立会话后,再访问个人页面,向服务器发送GET请求(数据包的格式讲解请参考上面预备知识),主要是请求头里面的cookie。这个cookie存有之前得到的jsessionId,这个告诉服务器,我之前建立的是哪个session会话。当然我这里还把我的账号密码上传了,可能这个服务器需要吧。每个网站不一样,具体的还得抓包提醒。当然,这里的密码我会改掉的,大家肯定不能访问。
==============================================================
代码实现
那么我们在这里就可以用代码实现这个访问过程,这里的关键是如何构造一样的cookie然后上传。
这里根据如何上传这个cookie,可以分为3种方法:
第一种:直接使用ASIHTTP 的ASIHTTPRequest来访问,根据之前的预备知识,GET请求是把具体的内容编码到URL后面,,那么我就把这个cookie内容加在URL后面,具体关于jsession的使用,请参考这里:jsessionid的相关概念
实现代码如下
然后第二种方法是:完全模拟这个GET请求的数据包(如上面的图),构造的一摸一样,请求正问是空的。这里还是使用ASIHTTP这个库,使用起来方便。
第三种方法:其实跟第二种是一样的,第二种方法是把Cookie内容以字符串的形式放在请求头里面,但是ASIHTTP这个库支持cookie的使用,那第三种就单独使用Cookie,其实这样更复杂如下:
[align=left !important][color=initial !important][color=initial !important][backcolor=initial !important][color=initial !important]
基本上登入和访问服务器就写到这,这也是我这几天学习的结果,请大家指点,毕竟我是初学,肯定有很多错误的地方,写下来一是希望让自己做个总结,二是希望帮助现在还不太了解这块内容的朋友,因为我也摸索了很久,网上资料太少。
测试代码下载:http://download.csdn.net/detail/lp08011095/4190975
如果转载请注明出处:http://www.pan-apps.com/?p=281
当然我这里都是使用ASIHTTP的第三方库来访问服务器,如果你不想使用这个,那么可以使用ios的自己的api,具体的我现在也不太了解,大家可以参考下面几篇文章:
使用苹果api提交登入信息
关于IPHONE应用中HTTP上传请求协议总结 这里涉及到POST请求正文的内容,我下篇再写
谢谢
[完]
最近几天一直在学习iphone的网络编程,希望在没有api的情况下,做一个oa系统 的客户端,
所以认真的学习了一下http协议,以及如何发送请求包到服务器以及建立session会话等等
然后总结了一篇文章,费了我不少时间,在此和大家一起分享。因为我觉得网上这方面的资料不是很多
我把正文贴在这里,但是格式上不是很好,详细和完整的总结还是看我的原文吧:http://www.pan-apps.com/?p=281
=================正文========================================
最近几天,一直在学习网络编程方面,我觉得这是移动开发必须了解的知识吧
在实践中学习,才是最好的方法
于是就决定为公司OA系统做一个iphone客户端,但是前提是这个系统没有提供任何API,所以只能悲剧的通过抓包的形式分析,然后模拟发送请求的数据包,以达到访问系统的效果
其实这样的形式就相当于用程序去实现浏览器的功能,但这正是我要学习的网络编程
=======================================================
预备:
首先要了解访问服务器时,计算机到底做了些什么,
那么就要认真学习一下http协议:深入理解HTML协议,这篇非常详细非常好
还有:Http协议详解,HTTP协议实体的基本讲解
请求数据包的讲解可以看这里:http以post方式上传一个文件,构造其请求头和消息报文
认真看了这几篇之后,应该基本上对http协议,和访问服务器的原理有了一点理解了吧
当然,在iPhone网络开发上,很多人都用ASIHttp这个第三方库,使用非常方便,我也用这个库,因为iphone的网络api实在是太麻烦,
可以先学习一下:ASIHTTPRequest 详解, http 请求终结者
======================================================
开始
有了这些网络的知识后,就开始准备做客户端了
公司OA系统网址:http://218.0.4.4:8080/esoa
每个员工登入OA都需要账号和密码,那么想做客户端,那必须等先登入系统,然后才能访问个人页面。
那么,这里就需要解决两个问题:
- 怎么才能登入,也就是和服务器建立会话连接访问我的个人信息页面时,系统怎么知道我已经登入了呢?
首先,用浏览器登入系统,在登入界面输入账号密码,浏览器就通过post请求(还有get请求等等),把这个请求数据包发送到服务器,称做request,然后服务器接受后,确认账号密码没错,就建立连接,叫做Session,然后返回响应数据包(response),在响应头里有set-Cookie,告诉客户端jseessionId,这个jsessionId,是刚建立的session会话的唯一标示符,服务器的session里面可能记录我的账号信息,所以只要告诉服务器jsessionid,服务器就知道谁登入了系统,只要这个会话没有失效,那么这次连接就一直保持。
然后访问个人页面时,在访问请求(request)中会带上cookie,这个cookie中会带上这个jseeionId,这样,就告诉服务器是哪个session,服务器就知道我已经登入了,可以访问我的个人页面。
大概思路是这样,本人初学,不对地方请指正:www.pan-apps.com
下面分析时,会实例抓包讲解
=====================================================
分析
首先要解决第一个问题,如何登入。通过基础的学习,知道了这个过程其实
就是跟服务器建立连接,在创建session会话,但是前提是提交账号密码,验证成功。
那么没有api的情况下,就先分析一下登入页面:
查看登入界面的源代码(右击页面就有),看到了登入的表单信息:
<form action=”/esoa/login.do” method=”post” onSubmit=”return validateForm(this);”>
<input name=”username” style=”width: 150px;” class=”text” type=”text” value=”">
<input name=”password” style=”width: 150px” class=”password” type=”password”>
也就是说,登入时,这个页面会把用户名和密码以post请求的方式,发送给服务器,然后”/esoa/login.do”,这个页面进行处理账号密码。
此时,我也抓过包,一开始用的是IE9的开发工具,超郁闷的。提交账号密码登入后,页面会跳转到首页,而这个IE9的工具,只能显示当前页面的请求包的情况,之前登入的post包就不显示了,超郁闷的,迷惑了我很久,所以还是用其他抓包工具吧。
通过抓包,我看到了:点击登入之后,浏览器发送了一个post请求,然后服务器返回response,在response header中有set-cookie字段,里面内容为jsessionId=AESG23421DF…,这样子,服务器就把建立的session会话的标示Id保存在浏览器的cookie里面,然后浏览器请求其他页面时,就会向服务器发送带有jsessionId的cookie,告诉服务器这是哪个会话。
========================================================
代码实现
要模拟这个登入,现在有两种方法:
- 完全模拟这个post请求数据包,内容字段必须一摸一样,这个可以通过抓包实现通过iPhone网络操作的api或者ASIHTTP这个库的api来实现
而在本例中,完全可以通过ASIHTTP的api来操作,可以用ASIFormDataRequest实现post请求,非常方便,主要实现代码如下(具体代码请在文末下载源码,查看):
复制代码
|
这样就完成了post请求
然后获得响应头(response header),里面看到
![](http://www.pan-apps.com/wp-content/uploads/2012/03/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7-2012-03-31-%E4%B8%8B%E5%8D%884.09.13.png)
图中可见,通过Set-Cookie 将jsesssionId告诉了客户端,于是我便把这个jsessionId取出来,存在本地。下次访问个人页面时需要用到。
我为什么这么肯定已经登入了呢?是因为我已经在response body中看到了具体的信息:
![](http://www.pan-apps.com/wp-content/uploads/2012/03/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7-2012-03-31-%E4%B8%8B%E5%8D%884.19.04.png)
这样就完成了登入这块内容。
==========================================================
然后就是第二个问题,访问我的个人首页,当然这需要在前面登入的基础上完成
分析
现在访问个人首页,这个不需要上传什么数据,只要登入后就可以访问,那么这个肯定是一个GET请求,这样就先抓个包来看看
由于IE的开发工具方便,暂时先用这个抓包,如下:
![](http://www.pan-apps.com/wp-content/uploads/2012/03/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7-2012-03-31-%E4%B8%8B%E5%8D%884.42.24.png)
由此可看出与服务器建立会话后,再访问个人页面,向服务器发送GET请求(数据包的格式讲解请参考上面预备知识),主要是请求头里面的cookie。这个cookie存有之前得到的jsessionId,这个告诉服务器,我之前建立的是哪个session会话。当然我这里还把我的账号密码上传了,可能这个服务器需要吧。每个网站不一样,具体的还得抓包提醒。当然,这里的密码我会改掉的,大家肯定不能访问。
==============================================================
代码实现
那么我们在这里就可以用代码实现这个访问过程,这里的关键是如何构造一样的cookie然后上传。
这里根据如何上传这个cookie,可以分为3种方法:
第一种:直接使用ASIHTTP 的ASIHTTPRequest来访问,根据之前的预备知识,GET请求是把具体的内容编码到URL后面,,那么我就把这个cookie内容加在URL后面,具体关于jsession的使用,请参考这里:jsessionid的相关概念
实现代码如下
复制代码
|
然后第二种方法是:完全模拟这个GET请求的数据包(如上面的图),构造的一摸一样,请求正问是空的。这里还是使用ASIHTTP这个库,使用起来方便。
复制代码
|
第三种方法:其实跟第二种是一样的,第二种方法是把Cookie内容以字符串的形式放在请求头里面,但是ASIHTTP这个库支持cookie的使用,那第三种就单独使用Cookie,其实这样更复杂如下:
[align=left !important][color=initial !important][color=initial !important][backcolor=initial !important][color=initial !important]
1 | ///第三种方法,跟第二种基本一样,模拟一个get请求包,发送过去,前提是先抓包看看,,但是这里使用asihttp 这个库所支持的cookie, |
复制代码
|
基本上登入和访问服务器就写到这,这也是我这几天学习的结果,请大家指点,毕竟我是初学,肯定有很多错误的地方,写下来一是希望让自己做个总结,二是希望帮助现在还不太了解这块内容的朋友,因为我也摸索了很久,网上资料太少。
测试代码下载:http://download.csdn.net/detail/lp08011095/4190975
如果转载请注明出处:http://www.pan-apps.com/?p=281
当然我这里都是使用ASIHTTP的第三方库来访问服务器,如果你不想使用这个,那么可以使用ios的自己的api,具体的我现在也不太了解,大家可以参考下面几篇文章:
使用苹果api提交登入信息
关于IPHONE应用中HTTP上传请求协议总结 这里涉及到POST请求正文的内容,我下篇再写
谢谢
[完]