#ios和Android網(wǎng)絡(luò)請求

引言

只說IOS和Android官方自帶的網(wǎng)絡(luò)請求,不說第三方框架.

IOS

介紹

An NSURLConnection object lets you load the contents of a URL by providing a URL request object. The interface for NSURLConnection is sparse, providing only the controls to start and cancel asynchronous loads of a URL request. You perform most of your configuration on the URL request object itself.

NSURLConnection通過提供一個URL request對象下載URL的內(nèi)容,提供給NSURLConnection的接口是稀少的,只提供了控制開始和結(jié)束異步下載.但是可以對request object本身做更多的配置.

NSURLConnection只分異步和同步請求,如果要區(qū)分GET和POST請求,下面會說.

  • 同步請求

      + (NSData *)sendSynchronousRequest:(NSURLRequest *)request
               returningResponse:(NSURLResponse * _Nullable *)response
                           error:(NSError * _Nullable *)error
    
參數(shù) 解釋
request 用來下載的URL request,這個request對象是深度復(fù)制的過程,當前方法的時候不會影響其他正在請求的進程.
response 返回response信息
error 請求時如果錯誤發(fā)生輸出錯誤信息,可能是NULL
returnValue 返回的是NSData數(shù)據(jù),即請求成功返回的數(shù)據(jù)

DEMO

NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSLog(@"%@",data);
NSLog(@"繼續(xù)執(zhí)行");
  • 異步請求

      + (void)sendAsynchronousRequest:(NSURLRequest *)request
                        queue:(NSOperationQueue *)queue
            completionHandler:(void (^)(NSURLResponse *response,
                                        NSData *data,
                                        NSError *connectionError))handler
    
參數(shù) 解釋
request 用來下載的URL request,這個request對象是深度復(fù)制的過程,當前方法的時候不會影響其他正在請求的進程.
queue 選擇哪一個隊列去處理當請求結(jié)束
handler 請求處理函數(shù),就是回調(diào)函數(shù)

DEMO

NSURL *url=[NSURL URLWithString:@"http://apis.juhe.cn/mobile/get"];
NSURLRequest * request=[NSURLRequest requestWithURL:url];
NSOperationQueue    *queue =[NSOperationQueue mainQueue];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    //解析json
    NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
    NSLog(@"%@",dict);
}];
  • GET 和 POST請求

    ios設(shè)置get或者post請求使用NSMutableURLRequest這個類來創(chuàng)建request,異步同步和上面,只需要替換request就行.

NSMutableURLRequest is a subclass of NSURLRequest provided to aid developers who may find it more convenient to mutate a single request object for a series of URL load requests instead of creating an immutable NSURLRequest object for each load.

NSMutableURLRequest是NSURLRequest的子類,是為了幫助開發(fā)者能夠容易改造簡單的請求,從而代替NSURLConnection.

DEMO: (block的方式異步,無法對請求進行監(jiān)控)

- (void)NSURLConnectionSendAsynchronousPostRequest{
NSURL *url=[NSURL URLWithString:@"www.baidu.com"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
[request setHTTPMethod:@"POST"];//設(shè)置請求方式為POST肴茄,默認為GET
NSDictionary *dict=@{
                      @"key":@"0f91954955628c69dd7610ea9a5229ff",
                     @"dtype":@"json",
                     @"ps":@"100",
                      @"pno":@"2"
                        } ; //數(shù)據(jù)
NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil ];
[request setHTTPBody:data];//設(shè)置http body傳輸?shù)臄?shù)據(jù) json格式
NSOperationQueue   *queue =[NSOperationQueue mainQueue];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    //在這里做回調(diào)處理
    NSString *test1=[[NSString alloc] initWithData:data
                                         encoding:NSUTF8StringEncoding];
    NSLog(@"---%@",test1);

}];

}

DEMO (代理的方式,可以監(jiān)控請求)
只需要實現(xiàn)下面的delgete,然后這樣請求就行:
[NSURLConnection connectionWithRequest:request delegate:self];

    // 服務(wù)器開始給客戶端回傳數(shù)據(jù),這個方法只會執(zhí)行一次
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

    // 服務(wù)器開始回傳數(shù)據(jù),客戶端需要創(chuàng)建一個空的,可變的Data對象,用于存儲每次獲取的數(shù)據(jù)片段
    // @property (nonatomic,retain)NSMutableData * returnInfoData;
    self.returnInfoData = [[NSMutableData alloc]init];

    NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;
    // 狀態(tài)碼
    NSLog(@"%ld",httpResponse.statusCode);
    // 響應(yīng)報頭
    NSLog(@"%@",httpResponse.allHeaderFields);

    NSLOG_FUNCTION;

}

// 客戶端持續(xù)接收數(shù)據(jù),data是數(shù)據(jù)片段,整個數(shù)據(jù)分段返回,這個方法執(zhí)行的次數(shù)取決于數(shù)據(jù)總長度[response expectedContentLength]

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

    [_returnInfoData appendData:data];
    NSLOG_FUNCTION;
}


// 數(shù)據(jù)完全下載成功,接收到完整數(shù)據(jù)
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{

    // _returnInfoData 是完整的數(shù)據(jù)了

    [_returnInfoData release];
    NSLOG_FUNCTION;
}


// 數(shù)據(jù)下載失敗
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{

    NSLog(@"didFailWithError");
    NSLOG_FUNCTION;

}

ios7之后提出用NSURLSession替代NSURLConnection.

The NSURLSession class and related classes provide an API for downloading content. This API provides a rich set of delegate methods for supporting authentication and gives your app the ability to perform background downloads when your app is not running or, in iOS, while your app is suspended.

NSURLSession 類和相關(guān)類提供下載的api.這些api提供豐富的委托方法來處理后臺下載的流程,當你的app中斷或者無法運行.

  • NSURLSession :一個session對象
  • NSURLSessionConfiguration :當初始化session的配置對象
  • NSURLSessionTask :處理任務(wù)的基類
  • NSURLSessionDataTask:這個類是用來獲取數(shù)據(jù),將返回數(shù)據(jù)作為NSData返回
  • NSURLSessionUploadTask :上傳文件的一個類
  • NSURLSessionDownloadTask :下載臨時性的文件
  • NSURLSessionStreamTask:用來建立TCP/IP連接的

我們用NSURLSessionDataTask進行請求數(shù)據(jù),所以我們使用NSURLSessionDataDelegate代理來請求.
NSURLSessionDataDelegate:

  • URLSession:dataTask:didReceiveResponse:completionHandler :告知代理任務(wù)獲取到了服務(wù)器剛開始的回復(fù)

  • URLSession:dataTask:didBecomeDownloadTask:告知數(shù)據(jù)任務(wù)這個任務(wù)邊為下載任務(wù)

  • URLSession:dataTask:didBecomeStreamTask:告知這個數(shù)據(jù)任務(wù)轉(zhuǎn)變?yōu)橄螺dstream的任務(wù)

  • URLSession:dataTask:didReceiveData:告知代理data任務(wù)已經(jīng)獲取期望的數(shù)據(jù)

  • URLSession:dataTask:willCacheResponse:completionHandler:詢問代理數(shù)據(jù)任務(wù)返回的response是否要存到緩存中

DEMO:

    -(void)NSURLSessionDelgete{
    NSURL *url=[NSURL URLWithString:@"http://apis.juhe.cn/mobile/get"];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    [request setHTTPMethod:@"POST"];//設(shè)置請求方式為POST晌畅,默認為GET
    NSDictionary *dict=@{
                         @"key":@"0f91954955628c69dd7610ea9a5229ff",
                         @"dtype":@"json",
                         @"ps":@"100",
                         @"pno":@"2"
                         } ; //數(shù)據(jù)
    NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil ];
    [request setHTTPBody:data];//設(shè)置http body傳輸?shù)臄?shù)據(jù) json格式
    
    
    //代理的方法,主線程
    NSURLSession *session_1 = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate: self delegateQueue:[NSOperationQueue mainQueue]];
    
    //創(chuàng)建任務(wù)(因為要使用代理方法但指,就不需要block方法初始化)
    NSURLSessionDataTask *task_1 = [session_1 dataTaskWithRequest:request];
    //啟動
    [task_1 resume];
}
//服務(wù)器開始響應(yīng),準備返回數(shù)據(jù)
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
    //運行出來服務(wù)器的響應(yīng)
    completionHandler(NSURLSessionResponseAllow);
    //當網(wǎng)絡(luò)請求是基于http協(xié)議的時候抗楔,response的本質(zhì)為NSHTTPURLResponse
    //    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
    
    //初始化容器
    _mData = [NSMutableData data];
}

//客戶端接收數(shù)據(jù)
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    [_mData appendData:data];
}

//數(shù)據(jù)請求完成網(wǎng)絡(luò)請求成功棋凳,當error不為空,說明響應(yīng)出錯
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    if (error) {
        NSLog(@"error -- %@",error);
    }
    else
    {
        NSString *str = [[NSString alloc]initWithData:_mData encoding:NSUTF8StringEncoding];
        NSLog(@"delegate  -- %@",str);
    }
}

Android

Android自帶的有兩種:

  • HttpClient (已經(jīng)被棄用)
  • HttpURLConnection

所以我們只簡單說一下HttpURLConnection.

同步異步:

Android中的同步只需要在主線程執(zhí)行下面demo代碼就行,異步就是new Thread()一個線程.

Demo:(通過建立連接,對輸出輸入流讀寫來傳遞和獲取數(shù)據(jù))

    HttpURLConnection conn = null;
                try {
                    // 創(chuàng)建一個URL對象
                    URL mURL = new URL(url);
                    // 調(diào)用URL的openConnection()方法,獲取HttpURLConnection對象
                    conn = (HttpURLConnection) mURL.openConnection();

            conn.setRequestMethod("POST");// 設(shè)置請求方法為post
            conn.setReadTimeout(5000);// 設(shè)置讀取超時為5秒
            conn.setConnectTimeout(10000);// 設(shè)置連接網(wǎng)絡(luò)超時為10秒
            conn.setDoOutput(true);// 設(shè)置此方法,允許向服務(wù)器輸出內(nèi)容

            // post請求的參數(shù)
            String data = content;
            // 獲得一個輸出流,向服務(wù)器寫數(shù)據(jù),默認情況下,系統(tǒng)不允許向服務(wù)器輸出內(nèi)容
            OutputStream out = conn.getOutputStream();// 獲得一個輸出流,向服務(wù)器寫數(shù)據(jù)
            out.write(data.getBytes());
            out.flush();
            out.close();

            int responseCode = conn.getResponseCode();// 調(diào)用此方法就不必再使用conn.connect()方法
            if (responseCode == 200) {

                InputStream is = conn.getInputStream();
                String response = getStringFromInputStream(is);
                return response;
            } else {
                throw new NetworkErrorException("response status is "+responseCode);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                conn.disconnect();// 關(guān)閉連接
            }
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末连躏,一起剝皮案震驚了整個濱河市剩岳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌入热,老刑警劉巖拍棕,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異勺良,居然都是意外死亡绰播,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門尚困,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蠢箩,“玉大人,你說我怎么就攤上這事∶冢” “怎么了滔韵?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掌实。 經(jīng)常有香客問我陪蜻,道長,這世上最難降的妖魔是什么贱鼻? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任囱皿,我火速辦了婚禮,結(jié)果婚禮上忱嘹,老公的妹妹穿的比我還像新娘嘱腥。我一直安慰自己,他們只是感情好拘悦,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布齿兔。 她就那樣靜靜地躺著,像睡著了一般础米。 火紅的嫁衣襯著肌膚如雪分苇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天屁桑,我揣著相機與錄音医寿,去河邊找鬼。 笑死蘑斧,一個胖子當著我的面吹牛靖秩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播竖瘾,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼沟突,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捕传?” 一聲冷哼從身側(cè)響起惠拭,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庸论,沒想到半個月后职辅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡聂示,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年域携,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片催什。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡涵亏,死狀恐怖宰睡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情气筋,我是刑警寧澤拆内,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站宠默,受9級特大地震影響麸恍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搀矫,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一抹沪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓤球,春花似錦融欧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绿饵,卻和暖如春夷恍,著一層夾襖步出監(jiān)牢的瞬間厘擂,已是汗流浹背匾浪。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工草慧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吸祟。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓瑟慈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親欢搜。 傳聞我的和親對象是個殘疾皇子封豪,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容