网络编程中有以下几种方式向服务器进行提交数据:
IOS同步请求、异步请求、GET请求、POST请求

1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,

2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行

3、GET请求,将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节;

4、POST请求,将参数放到body里面。POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获。
 
接下来借用代码来演示四种请求方式的实现:
第一种是使用:GET请求方式
  1. -(void)loginByGet
  2. {
  3. //1.创建NSURL对象,设计连接的地址
  4. NSString *strURL =[NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];
  5. NSURL *url = [NSURL URLWithString:strURL];
  6.  
  7. //2.创建NSURLRequest请求对象
  8. NSURLRequest *request = [NSURLRequest requestWithURL:url];
  9. /**
  10. * NSURLReqest 如果是不可变的,则不可设置超时时间。
  11. */
  12. //3.创建NSURLConnection连接对象
  13. NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
  14.  
  15. //4.向服务器发送请求
  16. [connection start];
  17. }

第二种是使用:POST请求方式

  1. -(void)loginByPost
  2. {
  3. //1.创建NSURL对象,设计连接的地址
  4. NSString *strURL = @"http://127.0.0.1/userManager/login.php";
  5. NSURL *url = [NSURL URLWithString:strURL];
  6.  
  7. //2.创建NSURLRequest请求对象
  8. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  9. [request setTimeoutInterval:5.0];//设置连接超时的等待时间;
  10. [request setHTTPMethod:@"post"];//设置请求方式为POST
  11. //设置post带的数据
  12. NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];
  13. NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding];
  14. //通过协议头进行携带数据
  15. [request setHTTPBody:dataBody];
  16.  
  17. //3.创建NSURLConnection连接对象
  18. NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
  19.  
  20. //向服务器发送请求
  21. [conn start];
  22.  
  23. }

第三种是使用:同步请求方式

  1. -(void)loginByPost
  2. {
  3. //1.创建NSURL对象,设计连接的地址
  4. NSString *strURL = @"http://127.0.0.1/userManager/login.php";
  5. NSURL *url = [NSURL URLWithString:strURL];
  6. //2.创建NSURLRequest请求对象
  7. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  8. [request setTimeoutInterval:5.0];//超时时间
  9. [request setHTTPMethod:@"post"];//设置使用post方式
  10. //设置post带的数据
  11. NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];
  12. NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding];
  13. //通过协议头进行携带数据
  14. [request setHTTPBody:dataBody];
  15.  
  16. //3.创建NSURLConnection连接对象
  17. NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
  18. //4.向服务器发送请求
  19. [conn start];
  20.  
  21. //清理数据
  22. NSData *data = [@"" dataUsingEncoding:NSUTF8StringEncoding];
  23. [self.allDatas setData:data];
  24.  
  25. }

第四种是使用:异步请求方式

  1. -(void)asyncLogin
  2. {
  3. //1.创建NSURL对象,设置连接的地址
  4. NSString *strURL = @"http://127.0.0.1//userManager/login.php";
  5. NSURL *url = [NSURL URLWithString:strURL];
  6.  
  7. //2.创建NSURLRequest请求对象(POST)
  8. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  9. //设置请求方式
  10. [request setHTTPMethod:@"POST"];
  11. //在异步请求方式中,通过协议体进行携带数据传送
  12. NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];
  13. NSData *data = [strBody dataUsingEncoding:NSUTF8StringEncoding];
  14. [request setHTTPBody:data];
  15. //3.创建异步请求
  16. //block将代码进行封装,作为一个参数加到这个方法中,当数据传输完成之后,才调用block进行输出。当调用block时,将接收到的服务器响应、数据,还有出错信息,传送到block中,进行判断输出。
  17. [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  18. if (connectionError) {
  19. NSLog(@"Error reason:%@",connectionError);
  20. }
  21. else
  22. {
  23. //设置编码
  24. unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
  25. //将从服务器收到的数据进行输出
  26. NSString *request = [[NSString alloc]initWithData:data encoding:encoding];
  27. NSLog(@"%@",request);
  28. }
  29. }];
  30. }

在使用NSURLConnection连接对象时,还需要实现<NSURLConnectionDataDelegate>代理方法

  1. #pragma mark - NSURLConnection代理方法
  2. //收到服务器返回的数据,可能会执行很多次,因为数据如果很大的话,会进行分包发送
  3. -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  4. {
  5. //将所有数据段进行拼接,将新接收的数据段进行追加
  6. [self.allDatas appendData:data];
  7. }
  8. //连接过程中出错处理
  9. -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
  10. {
  11. NSLog(@"error reason:%@",error);
  12. }
  13. //数据接收完毕,做最后的数据处理
  14. -(void)connectionDidFinishLoading:(NSURLConnection *)connection
  15. {
  16. //当传输的文件中,如果含有汉字的,系统无法识别这种编码
  17. unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
  18. //按照encoding这种编码方式,将接收到数据段进行输出
  19. NSString *request = [[NSString alloc]initWithData:self.allDatas encoding:encoding];
  20. NSLog(@"%@",request);
  21. }

在POST请求方式中,如果希望看到数据传输的进度,可以通过实现以下方法进行打印输出。

  1. //以post方式传数据时返回数据传输的进度,仅限于以post方式
  2. -(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
  3. {
  4. NSLog(@"bytes:%ld,totalBytes:%ld,totalBytesExpected:%ld",bytesWritten,totalBytesWritten,totalBytesExpectedToWrite);
  5. }
 
知识点补充:GET请求和POST请求方式

GET

  1. GET的语义是获取指定URL上的资源
  2. 将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,各个变量之间使用“&”连接
  3. 不安全,因为在传输过程中,数据被放在请求的URL中
  4. 传输的数据量小,这主要是因为受URL长度限制

POST

  1. POST的语意是对指定资源“追加/添加”数据
  2. 将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向URL
  3. 所有数据对用户来说不可见
  4. 可以传输大量数据,上传文件只能使用Post
网络访问的四个步骤
  • 第一步:确定地址——URL
  • 第二步:建立请求
  • 第三步:开始连接

等待网络处理中……

  • 第四步:连接完成,处理结果

iOS_网络编程的更多相关文章

  1. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  2. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  3. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  4. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  5. 浅谈C#网络编程(一)

    阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...

  6. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  7. Java - 网络编程

    Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh.     参考:  

  8. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  9. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

随机推荐

  1. windows共享文件夹给centOS

    服务器使用的是CentOS系统,而本机使用的win7系统.考虑到是临时使用,所以就不打算搭建FTP和Samba服务器,直接通过CentOS挂载windows共享文件夹的方式来达到此目的. 既然是使用w ...

  2. OpenCV学习笔记七:opencv_nonfree模块

    一,简介: 顾名思义,这个模块不是free的.主要包含: 1,SIFT implementation. The class implements SIFT algorithm by D. Lowe. ...

  3. FTP(File Transfer Protocol)是什么?

    文件传输协议 FTP(File Transfer Protocol),是文件传输协议的简称.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).用户可以通过 ...

  4. bloom filter + murmurhash

    是一种hash方法,其实核心思想就是,将一个字符串通过多个普通hash函数映射到hash表上,然后再进行检索的时候同样计算hash函数,如果全都都hash表上出现过,那么说明有极大的可能出现过,如果没 ...

  5. Android输入法的显示与隐藏

    显示输入法: public void ShowSoftInput(View v) { // v 接受输入的控件 mInputMethodManager = (InputMethodManager) ( ...

  6. (七)solr7之Terms组件的使用

    (七)solr7之Terms组件的使用 Terms组件提供访问索引项的字段和每个词相匹配的文档数量. 这可以用于建立一个自动建议特性或任何其他的特性,而这个terms不是搜索或文档级别的水平.快速检索 ...

  7. mongodb基础操作

    查询选择器>db.customers.find({age:{$lt:102}})查询age小于102的数据$lte表示小于或等于$gt表示大于$gte表示大于或等于>db.customer ...

  8. Java 自带的加密类MessageDigest类(加密MD5和SHA)

    Java 自带的加密类MessageDigest类(加密MD5和SHA) - X-rapido的专栏 - CSDN博客 https://blog.csdn.net/xiaokui_wingfly/ar ...

  9. HTP 302 SEO作弊

    w 李智慧

  10. jfinal实现上传功能

    首先,jsp页面:由于设置enctype="multipart/form-data",所以form里面的input的值以2进制的方式传过去. <form id="f ...