HTTP协议(异步和同步)

//

//  ViewController.m

//  UI-NO.18

//

//  Created by Bruce on 15/8/11.

//  Copyright (c) 2015年 Bruce. All rights reserved.

//

/*

 

 http协议:

 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。

http是用于www(万维网)浏览传输数据的一个协议

访问的是远程的网络资源,格式是http://

 

 http://服务器地址 资源的位置

//  http://www.baidu.com/user/chginfo

 

 

 

 

 WWW是环球信息网的缩写,(亦作“Web”、“WWW”、“‘W3‘”,英文全称为“World Wide Web”),中文名字为“万维网”,"环球网"等,常简称为Web。 分为Web客户端和Web服务器程序。 WWW可以让Web客户端(常用浏览器)访问浏览Web服务器上的页面。 是一个由许多互相链接的超文本组成的系统,通过互联网访问。在这个系统中,每个有用的事物,称为一样“资源”;并且由一个全局“统一资源标识符”(URL)标识;这些资源通过超文本传输协议(Hypertext Transfer Protocol)传送给用户,而后者通过点击链接来获得资源。

 万维网联盟(英语:World Wide Web Consortium,简称W3C),又称W3C理事会。1994年10月在麻省理工学院(MIT)计算机科学实验室成立。万维网联盟的创建者是万维网的发明者蒂姆·伯纳斯-李。

 

 IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层(识别数据内容),

 

 

 http协议的作用:

 (1)规定客户端和服务器之间的数据传输格式

 

 (2)让客户端和服务器能有效地进行数据沟通

 

 

 为什么选择使用HTTP

 

 (1)简单快速  因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快

 

 (2)灵活  HTTP允许传输任意类型的数据

 

 (3)HTTP 是非持续连接  限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间

 

 

 HTTP的通信过程

 (1)请求:客户端向服务器索要数据

 

 (2)响应:服务器返回客户端相应的数据

 

 

 

 

 *****

 HTTP的请求方法:get post

 

 

 

 get:会把请求的内容  拼接到  链接 地址 里面(数据请求的时候  默认是get)

 

 www.baidu.com/user/login?username=刘水,psw=123

 

 get特征:

 1、浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB

 2、会把请求的数据 暴露在接口里面

 

 

 post 参数全部放在请求体中  

 这样就保证了 数据的安全

 没有具体的长度限制(唯一的限制 就是 服务器的承受能力)

 

 

 选择GET和POST的建议

 

 (1)如果要传递大量数据,比如文件上传,只能用POST请求

 

 (2)GET的安全性比POST要差些,如果包含机密\敏感信息,建议用POST

 

 (3)如果仅仅是索取数据(数据查询),建议使用GET

 

 (4)如果是增加、修改、删除数据,建议使用POST

 

 

 

 

 

 

 

 

 URL:Uniform Resource Locator(统一资源定位符)

 通过1个URL,能找到互联网上唯一的1个资源

 

 

 

 //    字符串读取网络数据

 NSURL *url = [NSURL URLWithString:@"http://baike.baidu.com/link?url=vis7S5gBFGNFsbWKyvohMqFDMirD45BqSe23YRkb4481UWxZBMHeIEIpQ3XvZLGlWT11XIzxr4_T7R7dEH7GcK"];

 NSString *recvieString = [[NSString alloc]initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

 NSLog(@"%@",recvieString);

 */

 

/*

 //    读取网络图片

 NSURL *url = [NSURL URLWithString:@"http://img.baidu.com/img/baike/logo-baike.png"];

 NSData *imageData = [[NSData alloc]initWithContentsOfURL:url];

 NSLog(@"%@",imageData);

 imageView.image = [UIImage imageWithData:imageData];

 */

 

//    同步请求

//    加载完网络数据  才会执行其他操作

//    会暂时 暂停用户响应  不可以操作手机  当网络请求结束后 恢复响应

 

//  异步加载  不会阻塞主线程  不会暂停用户响应 看界面 下载网络数据  是不互相影响的

 

 

//    同步请求

//    请求类 NSURLRequest

//    连接类 NSURLConnection

 

//    同步请求步骤:

//    1、有链接地址(URL)

//    2、创建请求(NSURLRequest)

//    3、连接请求地址 发送请求 返回数据(NSURLConnection)

/*

 //    1、有链接地址(URL)

 NSURL *url = [NSURL URLWithString:@"http://img.baidu.com/img/baike/logo-baike.png"];

 //    2、创建请求(NSURLRequest)

 NSURLRequest *request = [NSURLRequest requestWithURL:url];

 //    3、连接请求地址 发送请求 返回数据

 NSData *recvieData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

 UIImage *image = [UIImage imageWithData:recvieData];

 imageView.frame = CGRectMake(100, 100, image.size.width, image.size.height);

 imageView.image = image;

 */

 

/*

 //    异步请求

 //    1、创建URL地址

 //    2、创建请求

 //    3、连接地址发送异步请求

 

 NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101010100.html"];

 NSURLRequest *request = [NSURLRequest requestWithURL:url];

 //    发送异步请求

 [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

 //        connectionError 错误信息

 if (!connectionError) {

 //            response 服务器回应的信息

 NSLog(@"response%@",response);

 //            data 服务器返回的数据内容

 NSLog(@"data:%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);

 }

 

 }];

 

 

 

//    get方式请求数据的步骤

//    1、拼接url的链接地址字符串(把需要发送的内容 拼接到链接地址里面)

//    2、初始化URL

//    3、创建一个请求(可变的请求,需要设置请求的方式)

//    4、发送请求 返回请求内容

 

 

//    需要发送的请求内容

NSString *sendMessage = @"101010100";

//    拼接请求地址

NSString *urlString = [NSString stringWithFormat:@"http://m.weather.com.cn/data/%@.html",sendMessage];

//    初始化URL

NSURL *url = [NSURL URLWithString:urlString];

//    创建请求 设置请求方式

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5];

//    设置请求的方式种类

request.HTTPMethod = @"GET";

__block NSDictionary *recDic = [NSDictionary dictionary];

//    发送请求

NSOperationQueue *queue = [[NSOperationQueue alloc]init];

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

    

    //        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);

    

    //        解析JASN数据

    recDic =  [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

    

    //        NSLog(@"%@",recDic);

    

    //    解决 block里面参数不能外传的问题(不是block的问题  而是异步加载 在不同线程的问题  子线程还未执行完 就已经执行主线程的方法  这时候数据就是空的)

    //        等待子线程里面的任务执行完 在主线程里执行这个方法

    [self performSelectorOnMainThread:@selector(didRecvieData:) withObject:recDic waitUntilDone:YES];

}];

 

 

 

 

 

 

//    POST 请求步骤

//    1、准备POST的数据

//    2、初始化URL

//    3、创建请求   设置请求 (设置请求的方式POST 以及 POST的BODY)

//    4、发送请求 返回数据

 

 //    1、准备POST的数据

 NSString *bodyString = @"PlatformType=3&serviceId=39&brandId=11";

 //    2、初始化URL

 NSURL *url = [NSURL URLWithString:@"http://www.weihuok.com/customer2/GetFault"];

 //    3、创建请求   设置请求 (设置请求的方式POST 以及 POST的BODY)

 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5];

 request.HTTPMethod = @"POST";

 //    HTTPBody 是nsdata类型   需要把  post的数据转成对应格式

 request.HTTPBody = [bodyString dataUsingEncoding:NSUTF8StringEncoding];

 

 //    4、发送请求  返回请求数据

 [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

 NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);

 }];

 

 

 */

#import "ViewController.h"

 

@interface ViewController ()

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor blackColor];

 

    

    

    [self loadData6];

}

 

//直接读取网页中的字符串

- (void)loadData1

{

    NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];

    

    NSString *content = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

    NSLog(@"%@",content);

}

 

//直接读取 网络图片

- (void)loadData2

{

    

    NSURL *url = [NSURL URLWithString:@"http://preview.quanjing.com/is_rm001/is0997q92.jpg"];

    

    NSData *imageData = [NSData dataWithContentsOfURL:url];

    

    UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.view.frame];

    imageView.image = [UIImage imageWithData:imageData];

    imageView.contentMode = UIViewContentModeScaleAspectFit;

    [self.view addSubview:imageView];

}

 

//同步请求

- (void)loadData3

{

    NSURL *url = [NSURL URLWithString:@"http://img.baidu.com/img/baike/logo-baike.png"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    NSError *error;

    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];

    NSLog(@"error:%@",error);

    UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.view.frame];

    imageView.image = [UIImage imageWithData:data];

    imageView.contentMode = UIViewContentModeScaleAspectFit;

    [self.view addSubview:imageView];

}

 

//异步请求

- (void)loadData4

{

    UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.view.frame];

    imageView.contentMode = UIViewContentModeScaleAspectFit;

    [self.view addSubview:imageView];

    

    NSURL *url = [NSURL URLWithString:@"http://img.baidu.com/img/baike/logo-baike.png"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

 

 

    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        imageView.image = [UIImage imageWithData:data];

    }];

    

}

 

//get

- (void)loadData5

{

    NSString *string = @"http://apis.baidu.com/showapi_open_bus/mobile/find?num=13370116152";

    NSURL *url = [NSURL URLWithString:[string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    NSString *apiKey = @"e7f5ac9e7c42a6c8cb125ee1d7e8779e";

    NSLog(@"%@",url);

    NSMutableURLRequest *requst = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

    

    [requst addValue:apiKey forHTTPHeaderField:@"apikey"];

    requst.HTTPMethod = @"GET";

    

    [NSURLConnection sendAsynchronousRequest:requst queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

      

        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

        NSLog(@"==%@",dic);

    }];

    

}

 

- (void)loadData6

{

    //    1、准备POST的数据

 

 

    NSString *string = @"http://www.weihuok.com/customer2/GetService";

    //    2、初始化URL

    NSURL *url = [NSURL URLWithString:[string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    //    3、创建请求   设置请求 (设置请求的方式POST 以及 POST的BODY)

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5];

 

    request.HTTPMethod = @"POST";

    //    HTTPBody 是nsdata类型   需要把  post的数据转成对应格式

    request.HTTPBody = [[NSString stringWithFormat:@"%@",@{@"PlatformType":@"3"}] dataUsingEncoding:NSUTF8StringEncoding];

    

    //    4、发送请求  返回请求数据

    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        NSLog(@"=%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);

        

        NSDictionary *content = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

        

        NSLog(@"%@",content);

    }];

 

}

- (void)loadData

{

    NSString *apiKey = @"  e7f5ac9e7c42a6c8cb125ee1d7e8779e";

    NSNumber *idNum = @(-1);

    

    NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"http://apis.baidu.com/myml/c1c/c1c?%@",idNum]];

    

//    同步请求

    

//    创建请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];

    [request addValue:apiKey forHTTPHeaderField:@"apikey"];

    

//    连接服务器数据

    NSData *respondData =  [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

    

//    把NSData 转成 字符串类型

    NSString *respondString = [[NSString alloc]initWithData:respondData encoding:NSUTF8StringEncoding];

    

    NSLog(@"%@",respondString);

}

 

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

@end

 

时间: 2024-10-06 04:40:19

HTTP协议(异步和同步)的相关文章

Tornado源码分析系列之一: 化异步为'同步'的Future和gen.coroutine

转自:http://blog.nathon.wang/2015/06/24/tornado-source-insight-01-gen/ 用Tornado也有一段时间,Tornado的文档还是比较匮乏的,但是幸好其代码短小精悍,很有可读性,遇到问题时总是习惯深入到其源码中.这对于提升自己的Python水平和对于网络及HTTP的协议的理解也很有帮助.本文是Tornado源码系列的第一篇文章,网上关于Tornado源码分析的文章也不少,大多是从Event loop入手,分析Event loop的工作

网络请求数据 get请求方式   post请求 协议异步连接服务器 block异步连接服务器

网络请求三部 创建一个请求(添加接口,对接口进行解码,) 设定请求方式(将接口转为NSURL,设置请求[请求地址, 缓存策略, 超时时间],设置请求方式) 连接服务器([同步连接,异步连接]代理连接,block连接) #import "MainViewController.h" @interface MainViewController () @property (retain, nonatomic) IBOutlet UIImageView *ImageWiew; //get请求方法

核新通达信双协议异步交易接口介绍

HxTrade_SDK介绍文档 本文档文档介绍了核新通达信双协议异步交易SDK HxTrade的用法.如果您需要该接口或者合作项目开发请联系我下载演示程序,QQ:3257418287. 市面上券商的交易软件多采用2种协议:核新和通达信SSL,这两种协议一起大约占了95%的市场份额. HxTrade接口可同时支持这两种协议,也就是支持绝大多数的券商,可直接与券商服务器进行交互,具备普通交易和信用交易.撤单.当日查询.历史查询等 功能. HxTrade采用异步方式返回结果,用户在调用API接口后无需

win10 uwp 异步转同步

原文:win10 uwp 异步转同步 有很多方法都是异步,那么如何从异步转到同步? 可以使用的方法需要获得是否有返回值,返回值是否需要. 如果需要返回值,使用GetResults 如从文件夹获取文件: StorageFolder folder = StorageFolder.GetFolderFromPathAsync("").GetResults(); 这是同步方法,几乎不需要做什么修改 如果是没有返回值或不需要返回值的,请看下面代码 StorageFolder.GetFolderF

异步复位同步释放

同步复位与异步复位的优缺点 同步复位的优点: 一般能够确保电路是百分之百同步的. 确保复位只发生在有效时钟沿,可以作为过滤掉毛刺的手段. 同步复位的缺点: 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位.同时还要考虑如:时钟偏移.组合逻辑路径延时.复位延时等因素. 由于大多数的厂商目标库内的触发器都只有异步复位端口,采用同步复位的话,就会耗费较多的逻辑资源. 异步复位优点: 异步复位信号识别方便,而且可以很方便的使用全局复位. 由于大多数的厂商目标库内的触发器都有异步复位端口,

入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖

文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键,打印键值: 目录 概要 poll机制 异步通知 同步互斥阻塞 定时器防抖 概要: 查询方式: 12-3 缺点:占用CPU99%的资源.中断方式:12-4 缺点:调用read函数后如果没有按键按下,该函数永远不会结束,一直在等待按键按下. 优点:使用到了休眠机制,占用cpu资源极少.poll机制: 1

异步复位 同步释放

在FPGA设计中常遇到复位的设计,一般情况下,复位分为同步复位和异步复位. 异步复位与同步复位相比,其利用到了D触发器的CLR端,消耗硬件资源小,所以在很多情况下各个模块的复位方式选取为异步复位.但是异步信号容易产生潜在的危险:当异步复位信号在时钟上升沿附近取消复位状态时,时序电路很可能在此出现问题. 解决这个问题的一个方法为,对异步复位信号进行预处理,使其成为异步复位.同步释放的形式. 我设计的电路如下: library ieee; use ieee.std_logic_1164.all; u

异步执行同步等待结果

需求: 我们的Server服务接收Http请求,经过一系列的异步请求其它Server(对,我们的Server是一个FrontServer)后,生成最终的结果,返回给请求者. 在这个过程中,需要我们的Server等待一定时间,如果结果无法得出,也需要给前端返回错误码. 这是一个非常常见的需求,我们的方案很朴素,直接用POSIX的pthread_xx 函数调用,具体如下 struct SessionTask { pthread_mutex_t result_lock; pthread_cond_t

非主流node.js异步转同步

异步转同步方案分类 说起nodejs的异步转同步,估计大家不陌生.因为nodejs回调实在太多了,稍微复杂一点的程序就会有很多层的回调嵌套.为了处理这些令人抓狂的回调,我们一般需要使用一些框架或工具将这些异步过程转换成相对比较容易理解的同步过程,也就是我们本文所说的异步转同步.而完成这种转换的工具或库大体上可以分为三类:1. 回调链管理类 2. 编译工具类 3. 底层实现修改类. 第一类是最工具常见的,以Promise.async为代表.这类工具一般需要调用一个方法将我们 的处理函数包裹然后进行

关于Node.js异步转同步

用Node.js做开发我们有时候会很沉浸在它的异步回调机制中.发送一个请求,不管什么时候响应,我们写好一个对应的回调函数(callback),然后我们就可以进行下一步的操作.但是有时候我们又会陷入苦恼之中,比如说我必须在取得回调之后的数据之后才能进行接下来的操作,那么我们就要想办法转异步为同步了. 最常见的异步操作: Async(parameters,function(){ //回调操作 }) 但是如果在回调里面还有另外的回调,那我们就会陷入深深的回调泥潭里.步入正题,Node.js提供原生的P