iT邦幫忙

0

iOS APP 開發 OC 第十五天,網路請求(錯誤處理)

tags: OC 30 day


下面這段程式碼是上一篇文章做出來的。

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
            NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",str);
    }];

當我們發送請求時,會拿到三個東西。

  1. reponse
  2. data
  3. connectionError
    那我們拿數據時,不能直接拿,因為在我們拿資料前,網路很有可能會發生錯誤。

拿數據之前,應先判斷錯誤

可以利用if判變式,如下

if (!connectionError) {
    <#statements#>
}

當沒有錯誤時,執行放在裡面的代碼
因此我們按照當沒錯誤時,顯示資料。錯誤時,顯示錯誤訊息

        if (!connectionError) {
                        NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",str);
        }else{
            NSLog(@"error: %@",connectionError);
        }

錯誤處理處理完了嗎?還沒!! 還有reponse要處理

reponse是什麼呢?

我們來執行代碼,然後把respone po 出來
可以看到以下資訊:

<NSHTTPURLResponse: 0x60000119dac0> { URL: https://run.mocky.io/v3/39057ccc-3332-4a2f-a88f-7bd259f078b0 } { Status Code: 200, Headers {
    "Content-Length" =     (
        57
    );
    "Content-Type" =     (
        "application/json; charset=UTF-8"
    );
    Date =     (
        "Fri, 08 Jan 2021 06:32:46 GMT"
    );
    "Sozu-Id" =     (
        "a65d5768-0b74-40bf-b899-cb4dd63982bd"
    );
} }

你不難發現這些數據的是 header,那我們也得到了以下的結論:

reponse 就是 header
data 就是 body

利用 response 裡的 status 判斷狀態

connectionError 是什麼呢?

是我們發送數據之前的事情,判斷是否正常接受到伺服器返回的數據。

reponse是什麼類型呢?
NSURLRespons

完整的代碼

        if (!connectionError) {
            
            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
            if (httpResponse.statusCode == 200 || httpResponse.statusCode == 304){
                NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
                NSLog(@"%@",str);
            }else{
                NSLog(@"服務器內部測試");
            }
                        
        }else{
            NSLog(@"error: %@",connectionError);
        }

尚未有邦友留言

立即登入留言