【iPhone】网络编程–一起来做网站客户端(一)

news/2024/5/20 23:53:53/文章来源:https://blog.csdn.net/hope_worker/article/details/8577719

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都需要账号和密码,那么想做客户端,那必须等先登入系统,然后才能访问个人页面。

那么,这里就需要解决两个问题:

  1. 怎么才能登入,也就是和服务器建立会话连接
  2. 访问我的个人信息页面时,系统怎么知道我已经登入了呢?

这个其实在上面预备知识里都有,我简要复述一下:

        首先,用浏览器登入系统,在登入界面输入账号密码,浏览器就通过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,告诉服务器这是哪个会话。

========================================================

代码实现

要模拟这个登入,现在有两种方法:

  1.  完全模拟这个post请求数据包,内容字段必须一摸一样,这个可以通过抓包实现
  2. 通过iPhone网络操作的api或者ASIHTTP这个库的api来实现

第一种方法麻烦一点,要设置request 的 header 和body,这个包数据不大还好,如果数据量大,那就非常恐怖

而在本例中,完全可以通过ASIHTTP的api来操作,可以用ASIFormDataRequest实现post请求,非常方便,主要实现代码如下(具体代码请在文末下载源码,查看):

1 -(void)postRequest
2  
3 {
4     NSURL *url = [NSURL URLWithString:@"http://218.0.4.4:8080/esoa/login.do"];
5     ASIFormDataRequest *fr = [ASIFormDataRequest requestWithURL:url];
6     [fr addPostValue:@"linpan" forKey:@"username"];
7     [fr addPostValue:@"123456" forKey:@"password"];
8  
9     [fr setDelegate:self];
10     [fr startAsynchronous];
11 }

这样就完成了post请求

然后获得响应头(response header),里面看到

图中可见,通过Set-Cookie 将jsesssionId告诉了客户端,于是我便把这个jsessionId取出来,存在本地。下次访问个人页面时需要用到。

我为什么这么肯定已经登入了呢?是因为我已经在response body中看到了具体的信息:

这样就完成了登入这块内容。

==========================================================

然后就是第二个问题,访问我的个人首页,当然这需要在前面登入的基础上完成

分析

现在访问个人首页,这个不需要上传什么数据,只要登入后就可以访问,那么这个肯定是一个GET请求,这样就先抓个包来看看

由于IE的开发工具方便,暂时先用这个抓包,如下:

由此可看出与服务器建立会话后,再访问个人页面,向服务器发送GET请求(数据包的格式讲解请参考上面预备知识),主要是请求头里面的cookie。这个cookie存有之前得到的jsessionId,这个告诉服务器,我之前建立的是哪个session会话。当然我这里还把我的账号密码上传了,可能这个服务器需要吧。每个网站不一样,具体的还得抓包提醒。当然,这里的密码我会改掉的,大家肯定不能访问。

==============================================================

代码实现

那么我们在这里就可以用代码实现这个访问过程,这里的关键是如何构造一样的cookie然后上传。

这里根据如何上传这个cookie,可以分为3种方法:

第一种:直接使用ASIHTTP 的ASIHTTPRequest来访问,根据之前的预备知识,GET请求是把具体的内容编码到URL后面,,那么我就把这个cookie内容加在URL后面,具体关于jsession的使用,请参考这里:jsessionid的相关概念

实现代码如下:

1 第一种方法,因为这个页面是get请求,所以直接把参数加在url后面,就ok了
2 //获得jsessionid,这个我之前存在本地
3 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
4 NSString *jsessionId = [userDefaults objectForKey:@"jsessionId"];
5 NSString *ur =[NSString stringWithFormat:@"http://218.0.4.4:8080/esoa/index.do;jsessionid=%@?username=linpan&password=123456",jsessionId];
6 ASIHTTPRequest *indexRequest1 = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:ur]];
7 [indexRequest1 setDelegate:self];
8 [indexRequest1 startAsynchronous];

然后第二种方法是:完全模拟这个GET请求的数据包(如上面的图),构造的一摸一样,请求正问是空的。这里还是使用ASIHTTP这个库,使用起来方便。

1 ///第二中方法,模拟一个get请求包,发送过去,前提是先抓包看看
2     NSURL *loginUrl = [NSURL URLWithString:@"http://218.0.4.4:8080/esoa/index.do"];
3     //构造headers
4     ASIHTTPRequest *indexRequest2 = [ASIHTTPRequest requestWithURL:loginUrl];
5     [indexRequest2 addRequestHeader:@"Accept"value:@"text/html, application/xhtml+xml, */*"];
6     [indexRequest2 addRequestHeader:@"Accept-Language"value:@"zh-CN"];
7     [indexRequest2 addRequestHeader:@"User-Agent"value:@"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"];
8     [indexRequest2 addRequestHeader:@"Accept-Encoding"value:@"gzip, deflate"];
9     [indexRequest2 addRequestHeader:@"Host"value:@"218.0.4.4:8080"];
10     [indexRequest2 addRequestHeader:@"Connection"value:@"Keep-Alive"];
11     [indexRequest2 addRequestHeader:@"Referer"value:@"http://218.0.4.4:8080/esoa/login.do"];
12     [indexRequest2 setRequestMethod:@"GET"];
13     //根据抓到的包,header里面有一个字段Cookie,根据格式构造一个一样的
14     NSString *cookie = [NSString stringWithFormat:@"username=linpan; password=123456; JSESSIONID=%@",jsessionId];
15     [indexRequest2 addRequestHeader:@"Cookie"value:cookie];
16  
17     [indexRequest2 setDelegate:self];
18     [indexRequest2 startAsynchronous];

第三种方法:其实跟第二种是一样的,第二种方法是把Cookie内容以字符串的形式放在请求头里面,但是ASIHTTP这个库支持cookie的使用,那第三种就单独使用Cookie,其实这样更复杂如下:

1 ///第三种方法,跟第二种基本一样,模拟一个get请求包,发送过去,前提是先抓包看看,,但是这里使用asihttp 这个库所支持的cookie,
2 //即cookie不放在header里,单独构造
3  
4 NSURL *loginUrl3 = [NSURL URLWithString:@"http://218.0.4.4:8080/esoa/index.do"];
5 //构造headers
6 ASIHTTPRequest *indexRequest3 = [ASIHTTPRequest requestWithURL:loginUrl3];
7 [indexRequest3 addRequestHeader:@"Accept"value:@"text/html, application/xhtml+xml, */*"];
8 [indexRequest3 addRequestHeader:@"Accept-Language"value:@"zh-CN"];
9 [indexRequest3 addRequestHeader:@"User-Agent"value:@"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"];
10 [indexRequest3 addRequestHeader:@"Accept-Encoding"value:@"gzip, deflate"];
11 [indexRequest3 addRequestHeader:@"Host"value:@"218.0.4.4:8080"];
12 [indexRequest3 addRequestHeader:@"Connection"value:@"Keep-Alive"];
13 [indexRequest3 addRequestHeader:@"Referer"value:@"http://218.0.4.4:8080/esoa/login.do"];
14 [indexRequest3 setRequestMethod:@"GET"];
15  
16 //根据抓包结果,发现访问时发送了cookie文件,所以单构造一个cookie
17 NSDictionary *properties = [[[NSMutableDictionary alloc] init] autorelease];
18 [properties setValue:@"linpan" forKey:@"username"];
19 [properties setValue:@"123456" forKey:@"password"];
20 [properties setValue:@"JSESSIONID" forKey:jsessionId];
21 NSHTTPCookie *cookie2 = [[NSHTTPCookie alloc] initWithProperties:properties];
22 [indexRequest3 setRequestCookies:[NSMutableArray arrayWithObjects:cookie2,nil]];
23 [indexRequest3 setDelegate:self];
24 [indexRequest3 startAsynchronous];

基本上登入和访问服务器就写到这,这也是我这几天学习的结果,请大家指点,毕竟我是初学,肯定有很多错误的地方,写下来一是希望让自己做个总结,二是希望帮助现在还不太了解这块内容的朋友,因为我也摸索了很久,网上资料太少。

测试代码下载:http://download.csdn.net/detail/lp08011095/4190975

如果转载请注明出处:http://www.pan-apps.com/?p=281

当然我这里都是使用ASIHTTP的第三方库来访问服务器,如果你不想使用这个,那么可以使用ios的自己的api,具体的我现在也不太了解,大家可以参考下面几篇文章:

使用苹果api提交登入信息


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_884621.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编程要趁早 BI推荐8个编程学习网站

http://www.cocoachina.com/applenews/devnews/2013/0329/5914.html 最近一个热门话题是雅虎以3000万美元收购了移动阅读应用Summly&#xff0c;真正让人吃惊的不是3000万美元的价格值不值&#xff0c;而是Summly的开发者--只有17岁的尼克达洛伊西奥。他12岁开始学习编程&#…

自动为 Gatsby网站中的 Markdown 页面添加 sidebar

0 简介 我想在Gatsby网站上创建Markdown页面时自动添加侧边栏。 有一个 starter “ gatsby-gitbook-starter” 可以支持markdown文件的侧边栏&#xff0c;但仅支持1级。 我希望能够支持更多级别。 你可以通过下面的命令安装这个starter。 gatsby new gatsby-gitbook-starter…

如何在标题栏title前添加网站logo?

第一种方法&#xff1a;据说在网站根目录下放着我们的ico型logo&#xff0c;命名为favicon.ico&#xff0c;浏览器会自动去找到并显示。试了试&#xff0c;在firefox23和ie8下都没有成功。 第二种方法&#xff1a;添加代码&#xff0c;如下&#xff1a; 1 <link rel"sh…

阿里云域名解析完成后仍然无法通过域名正常访问网站

通过阿里云进行域名解析后&#xff0c;仍然无法正常访问网站的解释&#xff0c;与解决办法 1、域名解析完成后&#xff0c;未在主机管理页面进行域名绑定。 域名绑定流程&#xff1a; 进入阿里云虚拟主机页面&#xff0c;找到相应的虚拟主机&#xff0c;点击后面的管理。 点击…

web页面性能优化以及SEO

前言&#xff1a; 在同样的网络环境下&#xff0c;两个同样能满足你的需求的网站&#xff0c;一个“Duang”的一下就加载出来了&#xff0c;一个纠结了半天才出来&#xff0c;你会选择哪个&#xff1f;研究表明&#xff1a;用户最满意的打开网页时间是2-5秒&#xff0c;如果等…

wordpress建站优化技巧

wordpress是一款开源的PHP博客程序&#xff0c;可以有大量的开源主题与插件&#xff0c;使用液非常简单&#xff0c;wordpress在全球范围应用都十分广泛&#xff0c;根据Pingdom.com最近发布的一份数据&#xff0c;2013年在Technorati排名前100的博客&#xff08;Technorati为一…

个人网站添加百度统计

网站如何添加百度统计&#xff1f; 上线网站后&#xff0c;需要进行网站的维护和及时观察网站的流量等方面去了解自己的网站&#xff0c;百度统计工具可以查看多少访客访问了网站&#xff0c;以及分析流量来源等情况。那应该如何为网站添加百度统计工具呢&#xff1f; 1、注册…

[转]50个c/c++源代码网站

[转]50个c/c源代码网站 Posted on 2010-03-05 14:59 feisky 阅读(1182) 评论(2) 编辑 收藏 所属分类: C/C C/C是最主要的编程语言。这里列出了50名优秀网站和网页清单&#xff0c;这些网站提供c/c源代码 。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C…

32个不应该做的JOOMLA SEO优化手法

32个不应该做的JOOMLA SEO优化手法 隐藏元件的方式有很多&#xff0c;這也是最常被誤用的SEO手法&#xff0c;但也是Google抓最兇的部分&#xff0c;所以你要避免&#xff1a; 1. 在白背景上使用白色文字 2. 藏字在圖的下方 3. 利用CSS隐藏文字 4. 用小字來建立鏈接以及增加…

Win7部署asp.net网站问题---HTTP 错误 500.0 - Internal Server Error 调用 LoadLibraryEx 失败...

在IIS上部署网站时遇到这样一个问题&#xff1a;“ HTTP 错误 500.0 - Internal Server Error调用 LoadLibraryEx 失败&#xff0c;在 ISAPI 筛选器 "C:\Program Files (x86)\Sybase\PowerDynamo\win32\dyisa03.dll" 上”。 具体的问题展示如图&#xff1a; 通过网络…

高效在线抠图网站

介绍几款高效的抠图网站&#xff0c;给那些不想动手的。 1、怪兽抠图 链接: https://818ps.com/koutu/ 这是一个国内的站点&#xff0c;抠图后的图片不需要登录就能下载。 点击 上传图片 上传你需要抠图的素材。 用蓝色画出想保留的区域 用红色画出想要抠除的区域 - 简单…

VS2013 发布网站时文件丢失解决办法

网站发布时&#xff0c;发现一些模板文件没有复制到文件夹中解决办法&#xff1a;选择文件打开属性窗口找到生成操作&#xff0c;选项选择“内容”&#xff0c;然后重新发布 转载于:https://www.cnblogs.com/linyongqin/articles/6393166.html

常用网站链接

IEEE802标准下载 Browse Standards | Get Program | IEEE Xplorehttps://ieeexplore.ieee.org/browse/standards/get-program/page/series?id68

WordPress使用七牛CDN加速网站教程

七牛是一个著名的云加速公司&#xff0c;国内很多大网站都在使用&#xff0c;而且对新用户会有不少的免费额度&#xff0c;如果网站不是很大的话完全够用。 今天waitig就给大家介绍一下如何使用七牛来给WordPress加速。 注册 首先去七牛注册一个账号&#xff0c;可以直接点此注…

网站进行SEO优化时如何做好布局内链?

5月12日SEO经验 昨日和杭州西湖区某企业SEO总监谈我们在优化中如何让蜘蛛有效抓取,谈到中到底站内链接布局有多重要?想必每一个专业的网站优化人员都知道,网站的每一个页面就像一张蜘蛛网一样,良好的站内链接能很好的吸引蜘蛛抓取,而且网站内链做的好,在一定程度上是可以取代外…

网站进行SEO优化是什么样的什么样的网站页面才算是高质量的页面?

现在很多SEOer都在追求权重,但权重的获取往往离不开高质量的页面,很多人把目光重点放在了首页的页面,从而忽视内页的优化,也是比较不合理的,那么在搜索引擎的认识之中,什么样的页面才算是高质量的页面呢?下面开铭网络就给大家来分享分享个人的见解。 开铭网络认为,搜索引擎判…

新站建设之初如何规划seo?新站seo这些策略和方法很关键

俗话说&#xff0c;早起的鸟儿有虫吃&#xff0c;网站优化工作也一样。勤劳的人会得到比别人更多的好处。然而&#xff0c;许多事情不是靠勤奋来实现的。我们需要注意方法和策略。如果要进行网站优化&#xff0c;在网站上线初期就要有明确的优化思路和明确的目标。从网站建设的…

新站建设之初如何规划seo?新站seo这些策略和方法很关键

俗话说&#xff0c;早起的鸟儿有虫吃&#xff0c;网站优化工作也一样。勤劳的人会得到比别人更多的好处。然而&#xff0c;许多事情不是靠勤奋来实现的。我们需要注意方法和策略。如果要进行网站优化&#xff0c;在网站上线初期就要有明确的优化思路和明确的目标。从网站建设的…

电子行业为什么需要做网站seo优化?

搜索引擎是用户查找信息的重要手段。通常,用户会通过百度搜索找到他们想要的信息,这是网络的主要驱动力。SEO是最大限度地提高我们网站在搜索引擎上的曝光率,让别人在数亿搜索结果中首先看到我们。然后就有可能产生订单或点击我们的广告来产生利润。因此,对于一个希望盈利的网站…

网站seo优化怎么做能快速提高关键词排名?网站seo流量提升策略和方案步骤分享

对于任何一个营销推广方式&#xff0c;实际上在某种程度上&#xff0c;都存在一定的基础流程&#xff0c;而搜索引擎优化也不例外&#xff0c;我们在做企业网站SEO排名的时候&#xff0c;总是有一个常用的策略&#xff0c;因此&#xff0c;如果你是刚接触SEO行业&#xff0c;我…