iOS_网络编程
1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,
2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行
3、GET请求,将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节;
-(void)loginByGet
{
//1.创建NSURL对象,设计连接的地址
NSString *strURL =[NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];
NSURL *url = [NSURL URLWithString:strURL]; //2.创建NSURLRequest请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
/**
* NSURLReqest 如果是不可变的,则不可设置超时时间。
*/
//3.创建NSURLConnection连接对象
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; //4.向服务器发送请求
[connection start];
}
第二种是使用:POST请求方式
-(void)loginByPost
{
//1.创建NSURL对象,设计连接的地址
NSString *strURL = @"http://127.0.0.1/userManager/login.php";
NSURL *url = [NSURL URLWithString:strURL]; //2.创建NSURLRequest请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval:5.0];//设置连接超时的等待时间;
[request setHTTPMethod:@"post"];//设置请求方式为POST
//设置post带的数据
NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];
NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding];
//通过协议头进行携带数据
[request setHTTPBody:dataBody]; //3.创建NSURLConnection连接对象
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self]; //向服务器发送请求
[conn start]; }
第三种是使用:同步请求方式
-(void)loginByPost
{
//1.创建NSURL对象,设计连接的地址
NSString *strURL = @"http://127.0.0.1/userManager/login.php";
NSURL *url = [NSURL URLWithString:strURL];
//2.创建NSURLRequest请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval:5.0];//超时时间
[request setHTTPMethod:@"post"];//设置使用post方式
//设置post带的数据
NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];
NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding];
//通过协议头进行携带数据
[request setHTTPBody:dataBody]; //3.创建NSURLConnection连接对象
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
//4.向服务器发送请求
[conn start]; //清理数据
NSData *data = [@"" dataUsingEncoding:NSUTF8StringEncoding];
[self.allDatas setData:data]; }
第四种是使用:异步请求方式
-(void)asyncLogin
{
//1.创建NSURL对象,设置连接的地址
NSString *strURL = @"http://127.0.0.1//userManager/login.php";
NSURL *url = [NSURL URLWithString:strURL]; //2.创建NSURLRequest请求对象(POST)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置请求方式
[request setHTTPMethod:@"POST"];
//在异步请求方式中,通过协议体进行携带数据传送
NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];
NSData *data = [strBody dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
//3.创建异步请求
//block将代码进行封装,作为一个参数加到这个方法中,当数据传输完成之后,才调用block进行输出。当调用block时,将接收到的服务器响应、数据,还有出错信息,传送到block中,进行判断输出。
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError) {
NSLog(@"Error reason:%@",connectionError);
}
else
{
//设置编码
unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
//将从服务器收到的数据进行输出
NSString *request = [[NSString alloc]initWithData:data encoding:encoding];
NSLog(@"%@",request);
}
}];
}
在使用NSURLConnection连接对象时,还需要实现<NSURLConnectionDataDelegate>代理方法
#pragma mark - NSURLConnection代理方法
//收到服务器返回的数据,可能会执行很多次,因为数据如果很大的话,会进行分包发送
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//将所有数据段进行拼接,将新接收的数据段进行追加
[self.allDatas appendData:data];
}
//连接过程中出错处理
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"error reason:%@",error);
}
//数据接收完毕,做最后的数据处理
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//当传输的文件中,如果含有汉字的,系统无法识别这种编码
unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
//按照encoding这种编码方式,将接收到数据段进行输出
NSString *request = [[NSString alloc]initWithData:self.allDatas encoding:encoding];
NSLog(@"%@",request);
}
在POST请求方式中,如果希望看到数据传输的进度,可以通过实现以下方法进行打印输出。
//以post方式传数据时返回数据传输的进度,仅限于以post方式
-(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
NSLog(@"bytes:%ld,totalBytes:%ld,totalBytesExpected:%ld",bytesWritten,totalBytesWritten,totalBytesExpectedToWrite);
}
GET
- GET的语义是获取指定URL上的资源
- 将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,各个变量之间使用“&”连接
- 不安全,因为在传输过程中,数据被放在请求的URL中
- 传输的数据量小,这主要是因为受URL长度限制
POST
- POST的语意是对指定资源“追加/添加”数据
- 将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向URL
- 所有数据对用户来说不可见
- 可以传输大量数据,上传文件只能使用Post
- 第一步:确定地址——URL
- 第二步:建立请求
- 第三步:开始连接
等待网络处理中……
- 第四步:连接完成,处理结果
iOS_网络编程的更多相关文章
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- python select网络编程详细介绍
刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- 猫哥网络编程系列:详解 BAT 面试题
从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...
- 浅谈C#网络编程(一)
阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...
- C++11网络编程
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...
- Java - 网络编程
Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh. 参考:
- Linux网络编程-IO复用技术
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
随机推荐
- Python urllib的urlretrieve()函数解析 (显示下载进度)
#!/usr/bin/python #encoding:utf-8 import urllib import os def Schedule(a,b,c): ''''' a:已经下载的数据块 b:数据 ...
- 我买网B轮融资成功,五周年豪掷千万回馈会员
对中粮我买网而言,近期的B轮融资应该算是最大的好消息了------8月1日,中粮我买网在京宣布完毕B轮融资.金额高达1亿美元.被称为"食品电商史上最大融资".据悉,本次融资 ...
- ftp uploadFileAction(重要)
TelnetOUtputStream os = ftpClient.put(filename); File file_in = new File(localPath); FileInputStream ...
- day12闭包,装饰器
一.闭包:内部函数引用了外部函数的变量. # f1() #闭包的定义 #内部的函数引用了外部函数的变量 # def f1(b): #闭包的常用状态 # def f2(): # print(b) # r ...
- [Docker]学习笔记--搭建gitlab
Gitlab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 详细介绍可以参照官网,https://about.gitlab.com/ 今天主要是通过 ...
- 【BZOJ1941】[Sdoi2010]Hide and Seek KDtree
[BZOJ1941][Sdoi2010]Hide and Seek Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了 ...
- 1603 限高二叉排列树(计数DP)
1603 限高二叉排列树 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 作为游戏魔方的编写者和管理员,Bob在很多主存模块中 ...
- echarts, 小知识点随意记录,
注意点: 写echarts代码时,注意格式,每个项的子项用‘,‘分隔,最后一项不需要.如符号不也会造成图形显示不出来.写时注意参照配置项. 如下orient的属性需要单引号,每个项需要逗号等. leg ...
- IOS开发复习笔记(4)-TableView
总结几个TableView常用的代码 1.初始化方面 static string CellIndetifier=@"cellIndetifier"; -(NSInteger)num ...
- Vuejs2.0 cnpm 安装脚手架项目模板
NPM 方法 因为npm 安装速度慢,所以我们可以使用淘宝的镜像cnpm 再安装之前 我们需要先安装nodejs 因为vue框架也是基于nodeljs 下载地址:http://nodejs.cn/d ...