网络编程–一起来做网站客户端

news/2024/5/19 21:05:25/文章来源:https://blog.csdn.net/wwwang89123/article/details/8690298

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

最近几天,一直在学习网络编程方面,我觉得这是移动开发必须了解的知识吧

在实践中学习,才是最好的方法

于是就决定为公司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,这个我之前存在本地
3NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
4NSString *jsessionId = [userDefaults objectForKey:@"jsessionId"];
5NSString *ur =[NSString stringWithFormat:@"http://218.0.4.4:8080/esoa/index.do;jsessionid=%@?username=linpan&password=123456",jsessionId];
6ASIHTTPRequest *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里,单独构造
3NSURL *loginUrl3 = [NSURL URLWithString:@"http://218.0.4.4:8080/esoa/index.do"];
4//构造headers
5ASIHTTPRequest *indexRequest3 = [ASIHTTPRequest requestWithURL:loginUrl3];
6[indexRequest3 addRequestHeader:@"Accept" value:@"text/html, application/xhtml+xml, */*"];
7[indexRequest3 addRequestHeader:@"Accept-Language" value:@"zh-CN"];
8[indexRequest3 addRequestHeader:@"User-Agent" value:@"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"];
9[indexRequest3 addRequestHeader:@"Accept-Encoding" value:@"gzip, deflate"];
10[indexRequest3 addRequestHeader:@"Host" value:@"218.0.4.4:8080"];
11[indexRequest3 addRequestHeader:@"Connection" value:@"Keep-Alive"];
12[indexRequest3 addRequestHeader:@"Referer" value:@"http://218.0.4.4:8080/esoa/login.do"];
13[indexRequest3 setRequestMethod:@"GET"];
14//根据抓包结果,发现访问时发送了cookie文件,所以单构造一个cookie
15NSDictionary *properties = [[[NSMutableDictionary alloc] init] autorelease];
16[properties setValue:@"linpan" forKey:@"username"];
17[properties setValue:@"123456" forKey:@"password"];
18[properties setValue:@"JSESSIONID" forKey:jsessionId];
19NSHTTPCookie *cookie2 = [[NSHTTPCookie alloc] initWithProperties:properties];
20[indexRequest3 setRequestCookies:[NSMutableArray arrayWithObjects:cookie2,nil]];
21[indexRequest3 setDelegate:self];
22[indexRequest3 startAsynchronous];

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

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

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

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

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

相关文章

使用IntelliJ IDEA开发SpringMVC网站(二)框架配置

华为软件开发云5月大聚惠&#xff0c;8大服务限时免费&#xff0c;拼手气赢华为Mate9&#xff01;>>> 摘要: 讲解如何配置SpringMVC框架xml&#xff0c;以及如何在Tomcat中运行 转载请注明出处&#xff1a;Gaussic&#xff08;一个致力于AI研究却不得不兼顾项目的研…

使用IntelliJ IDEA开发SpringMVC网站(二)框架配置

华为软件开发云5月大聚惠&#xff0c;8大服务限时免费&#xff0c;拼手气赢华为Mate9&#xff01;>>> 摘要: 讲解如何配置SpringMVC框架xml&#xff0c;以及如何在Tomcat中运行 转载请注明出处&#xff1a;Gaussic&#xff08;一个致力于AI研究却不得不兼顾项目的研…

外国网站摘录的一个关于Jsoup的简单实例

jsoup HTML parser hello world examples By mkyong | January 16, 2013 | Last Updated : October 9, 2013 Jsoup, a HTML parser, its “jquery-like” and “regex” selector syntax is very easy to use and flexible enough to get whatever you want. Below are three e…

Mac - MAMP - WordPress - 搭建 php+MySQL 网站开发环境

文章目录 下载MAMPWordpress 配置 下载 MAMP MAMP是Mac平台上一款用于Web开发的本地服务器环境的工具。 MAMP这几个首字母代表苹果的OSX系统上的Macintosh、Apache、MySQL和PHP&#xff0c;即 MAMP 内含 Apache 服务器、PHP 安装套件以及MySQL安装套件。 https://www.mamp.i…

推荐几个设计师常去的优秀素材网站!收藏好哦!

1、创客贴 网址&#xff1a;www.chuangkit.com 创客贴是一个专业的平面设计工具网站&#xff0c;功能强大、全面&#xff0c;操作十分简单&#xff0c;有超过10w的各种场景模板&#xff0c;支持在线多人、多终端协作&#xff0c;关键还免费&#xff01; 2、包图网 网址&#x…

作为一名平面设计师,你必须知道的一些素材网站

随着互联网日新月异的发展速度&#xff0c;平面设计成为了各个行业宣传中一个重要部分。作为一名优秀平面设计师&#xff0c;不管是学习还是工作当中&#xff0c;都少不了需要一些灵感&#xff0c;但是常常为找不到灵感而苦恼&#xff0c;在你灵感枯竭&#xff0c;创意干涸的时…

设计师不可错过的2022年设计类网站大搜集,素材 教程 案例 全都有

经常看大家找素材着急&#xff01;为没有灵感发疯&#xff01;特意为大家整理2017最新的一些关于设计的素材网站、自学网站&#xff0c;字体网站、等一些压箱底的干货包含全部链接&#xff01; 希望能给大家带来帮助。喜欢可以加关注。一起分享设计资源&#xff01; 花瓣网 ht…

某漫画网站MD5参数分析

原创 Mr.Yang 菜鸟童靴 今天 声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 练习网站平台: aHR0cHMlM0EvL3R3Lm1hbmh1YWd1aS5jb20v 抓取目标: 抓到对应的漫画,图片地址 开始我们的分析: 根据图上,标注可以很容易看到这里有…

【转载】如何在网站中添加音乐

来源&#xff1a;http://www.ido321.com/1042.html 发现有很多的个人博客中添加了背景音乐&#xff0c;以增强用户体验。LZ搜集到了两种在网站中添加音乐的方式。 一、豆瓣的FM 这个非常简单&#xff0c;一段代码就可以实现。 <p><iframe name"iframe_canvas&quo…

使用JSSDK实现网站的QQ登录

使用JSSDK实现网站的QQ登录 进入QQ互联官网&#xff1a;https://connect.qq.com/index.html 进行开发者注册并审核认证【实名认证】&#xff1a;首先使用QQ账号登录上述的QQ互联官网&#xff1b;接着填写开发者审核认证资料&#xff0c;需提交&#xff1a;开发者类型&#xf…

网站流量统计

常使用web服务器的朋友大都了解&#xff0c;一般的web server有两部分日志&#xff1a; 一是运行中的日志&#xff0c;它主要记录运行的一些信息&#xff0c;尤其是一些异常错误日志信息 二是访问日志信息&#xff0c;它记录的访问的时间&#xff0c;IP&#xff0c;访问的…

利用网页压缩来提升网站浏览速度

网站的访问速度是由多个因素所共同决定的&#xff0c;这些因素例如应用程序的响应速度、网络带宽、服务器性能、与客户端之间的网络传输速度等等。其中最重要的 一个因素是应用程序本身的响应速度&#xff0c;因此当你为网站性能所苦恼时&#xff0c;你第一个需要着手进行处理的…

baidu网址提交|baidu收录网址提交|向百度提交网站

向百度提交网站:http://www.baidu.com/search/url_submit.html 方便百度爬行你的网站&#xff0c;收录你的信息 -------------------------- 新闻&#xff1a; Google天使投资人透露投资策略&#xff1a;团队第一 网站导航: 博客园首页 新闻 .NET频道 社区 博问 闪存…

大型网站技术架构

架构演变第一步&#xff1a;物理分离webserver和数据库 最开始&#xff0c;由于某些想法&#xff0c;于是在互联网上搭建了一个网站&#xff0c;这个时候甚至有可能主机都是租借的&#xff0c;但由于这篇文章我们只关注架构的演变历程&#xff0c;因此就假设这个时候已经是托管…

如何设计通用的网站模板

http://www.serverjia.cn/html/wlpz/c/yy/2009/0311/29412.html 现在网络上已经到处可以看到使用模板开发出来的网站。使用模板开发网站有很多好处&#xff0c;最主要的就是模板与程序完全脱离&#xff0c;用户可以根据规定好的标签任意开发模板&#xff0c;导入到模板引擎里就…

opc-ua技术资料网站汇总

OPC官方网址&#xff1a;https://opcfoundation.org/ OPC中国官网&#xff1a; http://www.chinaopc.org/ ----------------------------------------------------------------- http://www.advosol.com/ 一个收费的国外OPC开发包 ------------------------------------…

大型网站架构技能图谱(Java版)

在大型网站技术架构中&#xff0c;涉及到许多的技术&#xff0c;这些技术是具备大型网站架构设计能力的前提和基础。因为笔者对Java比较熟悉&#xff0c;所以下面的技术图谱都是围绕Java后端工程师展开的。如有不正确或者不完善的地方&#xff0c;欢迎补充。

Fortran在线学习网站

Fortran Tutorialhttps://www.tutorialspoint.com/fortran/index.htm

8款HTML5/jQuery应用助网站走向高上大

在WEB3.0的时代&#xff0c;我们的网站不仅要实现实用价值&#xff0c;更要为用户设计优秀的用户体验。jQuery是一个不错的JS框架&#xff0c;结合目前最新的HTML5技术&#xff0c;我们可以将自己的网站脱胎换骨&#xff0c;立马走向高上大&#xff0c;至少在前端页面上。 1、…

localhost:6666/无法访问此网站

在写demo的时候遇到这个问题 反反复复检查了代码&#xff0c;操作了好几次&#xff0c;还是不行&#xff0c;后来查询到&#xff0c;是一些浏览器对某些端口做了限制&#xff0c;比如谷歌浏览器 更改了端口之后重新跑代码&#xff0c;没问题