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(安全套接字層)進行信息交換,在發送方把原始數據進行加密,然后在接收方進行解密,且雙方有共知的密鑰實現(安全性)。
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的不同
- DOM是基于內存的,不管文件有多大,都會將所有的內容預先裝載到內存,消耗內存
SAX是基于時間的,當某個事件被觸發時,才獲取相對的XML部分數據,從而不管XML文件多大,都只占用少量內存
2.DOM可以讀取XML也可以向XML文件中插入數據,而SAX只能讀取XML文件,不能插入修改(第一個缺點)
(第二個缺點)SAX:DOM也已指定要訪問的元素進行隨機訪問,而SAX不行,SAX必須開始執行遍歷,并且只遍歷一次,,也就是說我們不能隨機訪問XML文件,只能從頭到尾的將XML文件遍歷一次