網絡請求

URL

URL 全稱是Uniform Resource Locator,即統一資源定位符,通過一個URL,可以找到互聯網上唯一的一個資源
URL就是資源的地址、位置,互聯網上每個資源都有UI個唯一的URL
基本格式:協議://主機地址/路徑
-協議:不同的協議,代表著不同的資源查找方式,資源傳輸方式
-主機地址:存放資源的主機的IP地域
-路徑:資源在主機中的位置

HTTP 超文本傳輸協議

HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型
HTTP 在客戶端和服務器交互時:三次握手
巧了!什么是三次握手呢?
比如:A給B打電話,B:喂(第一次響應)A:喂(第二次響應)老王啊。。。(第三次響應)
<li>

F{}GK0ZSKWF24H$1TRS2KIH.jpg

</li>

HTTPS安全超文本傳輸協議

其使用SSL(安全套接字層)進行信息交換,在發送方把原始數據進行加密,然后在接收方進行解密,且雙方有共知的密鑰實現(安全性)。

![G$ZMZ[YTLR7@FMD{W$]SH1.jpg

HTTP協議的常見請求方式

<li>GET
<li>POST

相同點

給服務器傳輸數據

不同點

1.給服務器傳輸的方式不同
GET:通過網址字符串;
POST:通過data
2.傳輸數據的大小不同
GET:最多255字節
POST:容量超過1G
3.安全性
GET:類似于密碼的明文輸入,直接可見
PIST:數據被轉成二進制數據,類似于密碼的秘聞輸入,無法直接讀取


FQX3UX)_70SOG7PNVF)6DFJ.jpg

HTTP協議請求實現

連接方式

<li>同步連接:程序容易出現卡頓現象
<li>異步連接:等待數據返回
異步連接有兩種實現方式
1.設置代理,接收數據
2.實現block

GET/POST實現
創建URL.h放入url方便調取

#define GET_URL @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"
#define POST_URL @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"

#define POST_BODY @"date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"

設置屬性用來保存數據

@property(nonatomic,strong)NSMutableData * resultData;

同步GET

//1.創建URL
    NSURL * url = [NSURL URLWithString:GET_URL];
//2.根據URL創建具體的請求(使用什么請求方式)
//參數1:url  參數2:緩存策略  參數3:設置一個延遲時間,如果超過這個時間點,請求終止
NSURLRequest * request = [NSURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30];
 //3.接受網絡數據
  //參數1:請求對象  參數2:存儲一些網絡請求的信息,一般是nil(有包體的時候放包體)
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
 //4.解析json
    NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
    NSLog(@"%@",dict);

同步POST

 //1.創建URL
    NSURL * url = [NSURL URLWithString:POST_URL];
    //2.創建網絡請求[post請求必須初始化為可變的請求]
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    //2.1 設置body
    //創建連接字符 -------[這個內容在以后的開發當中,接口文檔都有注釋,或者就是后臺會直接給提供];
    NSString * dataStr = POST_BODY;
#warning ------注意:
    //對數據連接字符串進行編碼,轉化為UTF8編碼格式
    NSData * postData = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
//    NSLog(@"%@",postData);
    //3.設置請求格式設置為POST————————————必須大寫
    [request setHTTPMethod:@"POST"];
    //設置請求體(body)----把data放入到request里
    [request setHTTPBody:postData];
    //4.接受數據
    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSLog(@"%@",data);
    //5.進行JEON解析
    NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
    NSLog(@"%@",dict);

異步GET(方法一block)

  //1.創建URL
    NSURL * url = [NSURL URLWithString:GET_URL];
    //2.創建請求方式
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    //3.接受數據
//參數1:NSURLRequest
    //參數2:[NSOperationQueue mainQueue] 線程隊列,block在哪個線程中執行,主隊列,也叫串行隊列
    //參數3:response 攜帶者接口的信息 data 請求下來的數據
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        
        if (connectionError == nil) {
            NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
            NSLog(@"dict = %@",dict);
        }   
    }];

異步GET(方法二使用代理)

遵循協議<NSURLConnectionDataDelegate>
 //1.創建URL
    NSURL * url = [NSURL URLWithString:GET_URL];
    //2.創建請求方式
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
 //參數1:request對象  參數2:代理人
    [NSURLConnection connectionWithRequest:request delegate:self];
#pragma mark----------NSURLConnectionDataDelegate 相關代理方法
//服務器開始響應
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//初始化數組
    self.resultData = [NSMutableData data];
}
//接收數據
//該方法會重復執行,得到的每一段數據拼接在一起
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
//拼接data
    [self.resultData appendData:data];
}
//結束服務器
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
//進行解析
    NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:self.resultData options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"%@",dict);
}

異步POST

 //1.創建url
    NSURL * url = [NSURL URLWithString:POST_URL];
    //2.創建網絡請求
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    //2.1創建body
    NSString * string = POST_BODY;
    //轉碼
    NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];
    
    //請求方式
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:data];
    
    //接受數據
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        
        if (connectionError == nil) {
            NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
            NSLog(@"%@",dict);
        }
    }];

由此發現,GET/POST實現時都有必須實現的步驟(具體視情況而定)

//1.創建URL
NSURL * url = [NSURL URLWithString:*******];
//2.創建網絡請求
NSURLRequest * request = [NSURLRequest requestWithURL:url];
//3.接收網絡數據
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

你以為結束了嗎?錯!以上已經廢棄,隨著更新,會使用以下方法

Session

GET請求

//1.創建url
    NSURL * url = [NSURL URLWithString:GET_URL];
    //2.創建session對象
    NSURLSession * session = [NSURLSession sharedSession];
    //系統提供的全局的NSURLSession對象,單例
    //因為NSURLSession基于任務去完成相關的事件,所有的東西都放在任務內
    //3.創建task請求任務
    //NSURLSessionTask就是NSURLSession任務的執行對象
    NSURLSessionTask * task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //4.解析相關數據
        NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        NSLog(@"%@",dict);
    }];
#warning  -------  核心步驟--------
    //5.啟動任務
    //原因:NSURLSessionTask,task任務是屬于掛起的狀態,如果不啟動,不會走block中實現的內容
    [task resume];

POST請求

 //1.創建url
    NSURL * url = [NSURL URLWithString:POST_URL];
    //2.創建請求
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    //2.1設置包體
    NSString * bodyStr = POST_BODY;
    //轉碼
    NSData * postData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
    //設置請求格式
    [request setHTTPMethod:@"POST"];
    
    [request setHTTPBody:postData];
    //3.創建
    //創建session對象
    NSURLSession * session = [NSURLSession sharedSession];
    //創建請求任務
    NSURLSessionTask * task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //解析
        if (error == nil) {
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
            NSLog(@"%@",dict);
        }
    }];
    //啟動任務
    [task resume];

XML解析
DOM,SAX,DOM4J,JDON
DOM和SAX的不同

  1. DOM是基于內存的,不管文件有多大,都會將所有的內容預先裝載到內存,消耗內存
    SAX是基于時間的,當某個事件被觸發時,才獲取相對的XML部分數據,從而不管XML文件多大,都只占用少量內存
    2.DOM可以讀取XML也可以向XML文件中插入數據,而SAX只能讀取XML文件,不能插入修改(第一個缺點)
    (第二個缺點)SAX:DOM也已指定要訪問的元素進行隨機訪問,而SAX不行,SAX必須開始執行遍歷,并且只遍歷一次,,也就是說我們不能隨機訪問XML文件,只能從頭到尾的將XML文件遍歷一次
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容