## HTTP請求的常見方法
- GET
- 所有參數(shù)拼接在URL后面兰珍,并且參數(shù)之間用&隔開
- 比如http://520it.com?name=123&pwd=345
- 傳遞了2個參數(shù)給服務(wù)器
- name參數(shù):123
- pwd參數(shù):345
- 沒有請求體
- 一般用來查詢數(shù)據(jù)
- POST
- 所有參數(shù)都放在`請求體`中
- 一般用來修改喜鼓、增加、刪除數(shù)據(jù)
## 創(chuàng)建HTTP請求
- GET
```objc
// 請求路徑
NSString *urlString = @"http://520it.com?name=張三&pwd=123";
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 創(chuàng)建URL
NSURL *url = [NSURL URLWithString:urlString];
// 創(chuàng)建請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 設(shè)置請求方法(默認(rèn)就是GET請求)
request.HTTPMethod = @"GET";
```
- POST
```objc
// 請求路徑
NSString *urlString = @"http://520it.com/圖片";
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 創(chuàng)建URL
NSURL *url = [NSURL URLWithString:urlString];
// 創(chuàng)建請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 設(shè)置請求方法
request.HTTPMethod = @"POST";
// 設(shè)置請求體
request.HTTPBody = [@"name=張三&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];
```
## 使用NSURLConnection發(fā)送HTTP請求
### 發(fā)送同步請求
```objc
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
// 這個方法是阻塞式的藤树,會在當(dāng)前線程發(fā)送請求
// 當(dāng)服務(wù)器的數(shù)據(jù)完全返回時遇八,這個方法才會返回瘦赫,代碼才會繼續(xù)往下執(zhí)行
```
### 發(fā)送異步請求-block
```objc
+ (void)sendAsynchronousRequest:(NSURLRequest*) request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;
// 會自動開啟一個子線程去發(fā)送請求
// 當(dāng)請求完畢(成功\失敾恪),會自動調(diào)用handler這個block
// handler這個block會放到queue這個隊列中執(zhí)行
```
### 發(fā)送異步請求-delegate
- 創(chuàng)建NSURLConnection對象
```objc
// startImmediately==YES顽分,創(chuàng)建完畢后徐许,自動發(fā)送異步請求
- (instancetype)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;
- (instancetype)initWithRequest:(NSURLRequest *)request delegate:(id)delegate; // 創(chuàng)建完畢后,自動發(fā)送異步請求
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate; // 創(chuàng)建完畢后卒蘸,自動發(fā)送異步請求
```
- 發(fā)送請求
```objc
[connection start];
```
- 遵守`NSURLConnectionDataDelegate`協(xié)議雌隅,實現(xiàn)協(xié)議中的代理方法
```objc
// 當(dāng)接收到服務(wù)器的響應(yīng)時就會調(diào)用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
// 每當(dāng)接收到服務(wù)器返回的數(shù)據(jù)時就會調(diào)用1次(數(shù)據(jù)量大的時候,這個方法就會被調(diào)用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
// 當(dāng)服務(wù)器的數(shù)據(jù)完全返回時調(diào)用(服務(wù)器的數(shù)據(jù)接收完畢)
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
// 當(dāng)請求失敗的時候調(diào)用
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
```
- 取消請求
```objc
[connection cancel];
```
## NSString和NSData的互相轉(zhuǎn)換
- NSString -> NSData
```objc
NSData *data = [@"520it.com" dataUsingEncoding:NSUTF8StringEncoding];
```
- NSData -> NSString
```objc
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
```
```objc
//發(fā)送請求給服務(wù)器缸沃,加載右側(cè)的數(shù)據(jù)
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"a"] = @"list";
params[@"c"] = @"subscribe";
params[@"category_id"] =@(c.id);
[[AFHTTPSessionManager manager] GET:@"http://api.budejie.com/api/api_open.php" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
//字典轉(zhuǎn)模型數(shù)組
NSArray *users = [XJQRecommendUser objectArrayWithKeyValuesArray:responseObject[@"list"]];
//添加當(dāng)前類別對應(yīng)的用戶組
[c.users addObjectsFromArray:users];
//刷新表格
[self.detailVC reloadData];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
[SVProgressHUD showErrorWithStatus:@"加載數(shù)據(jù)失敗"];
}];
```