Get請求 : 從服務端直接獲取數據
1.Get請求一般只是從服務器獲取數據, 請求時一般會提交服務器一些請求參數, 附加載URL上的, 參數之間以&分割
2.URL中英文和數字進行原樣識別, 而中文或者一些其他字符需要計算機再進行編碼
3.Get請求提交的數據一般放在http協議的頭header中
Post請求 : 上傳數據改變服務端的內容
1.Post請求多用於給服務器提交數據
2.Post請求提交的數據一般放在http的主題數據包body中
Get與Post之間的區別 :
數據量的限制不同 :
(1)由於get請求提交的數據是依附於URL中, http協議沒規定URL長度及請求參數的個數, 所以理論上不存在大小限制, 但是不同瀏覽器對支持的URL最大先對有所限制
(2)http協議也沒有規定Post請求的大小, 所以理論上post的大小也沒有限制。但是往往服務端考慮到處理數據的能力, 會對它做一些限制。 但是一般Post請求數據的量會大於Get請求
安全性不同 :
(1)由於Get請求的數據附加語URL上, 所以提交的數據是可以看見的, 數據包被攔截後也是明文的, 再者瀏覽器的瀏覽的歷史記錄也會被人看見, 加入提交的是用戶名和麪那就很不安全
(2)Post提交的數據是在body體中, 相對安全性更高一些
請求一般分爲三步:
1.創建URL
2.創建請求Request
3.建立連接 完成數據請求
一、同步GET請求(Synchronous)
// 把網址放在字符串中
NSString *strURL = @"http://api.map.baidu.com/place/v2/search?query=銀行®ion=大連&output=json&ak=6E823f587c95f0148c19993539b99295";
// 因爲網址裏面不允許有漢字, 只能有26個字母的大小寫, 數字, 和一些特定的符號, 比如&, %, /等, 所以有中文的網址要先把中文變成相對應的數字編碼
// 漢字變編碼的方法 stringByAddingPercentEscapesUsingEncoding
NSString *strURLEncode = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 1. 創建一個URL
NSURL *url = [NSURL URLWithString:strURLEncode];
// 2. 發送一個請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 3. 建立一個連接
// 參數1: 把創建好的請求發送
// 參數2: 返回的響應信息
// 參數3: 錯誤信息
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
// 把data進行json解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", dic);
NSLog(@"%@", response);
//如果出現的錯誤是 : data parameter is nil 是因爲進行data進行json解析不能是空的, 首先檢查網絡, 或者是把程序和網絡斷開, 重新連接
同步POST
// post請求需要在請求的過程中 添加一個body, 添加之後纔可以獲取數據
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
// 1. 創建一個URL
NSURL *url = [NSURL URLWithString:urlStr];
// 2. 創建一個請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 先指定請求方式, 默認是get請求
[request setHTTPMethod:@"POST"];
// body的字符串
NSString *bodyStr = @"date=20131129&startRecord=1&len=30&udid=1234567890&terminalType=Iphone&cid=213";
// body的字符串變成NSData形式
NSData *bodydata = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
// 把bodydata放到request中
[request setHTTPBody:bodydata];
// 3. 建立一個連接
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// 4. 把data進行json解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSArray *arr = dic[@"news"];
for (NSDictionary *dic1 in arr) {
NSLog(@"%@", dic1[@"summary"]);
}
異步GET(AsyncSocket)
#pragma mark - 異步Get請求
#pragma mark - NSURLConnectionDataDelegate
- (IBAction)asynGET:(id)sender {
NSString *strURL = @"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg";
// 1. 創建URL
NSURL *url = [NSURL URLWithString:strURL];
// 2. 創建請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 3. 建立連接
[NSURLConnection connectionWithRequest:request delegate:self];
// 這個方法可以在2.0到9.0之間的版本使用, 9.0以上的版本不能使用這個方法, 注意!!!!
}
#pragma mark - 會返回響應信息
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
// 這個方法會返回響應信息
// 初始化裝數據的容器
self.data = [NSMutableData data];
}
#pragma mark - 接受到服務器返回的數據時調用(如果數據比較多, 這個方法可能會被調用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(@"接受服務器返回的數據");
// 這個方法會接受返回的數據
// 拼接數據
[self.data appendData:data];
}
#pragma mark - 網絡連接時出錯時調用
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"網絡連接出錯");
}
#pragma mark - 服務器的數據已經接受完畢時調用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"服務器的數據已經接受完畢");
// 把圖片顯示在上面
self.imageView.image = [UIImage imageWithData:self.data];
}