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); }];
当我们发送请求时,会拿到三个东西。
reponsedataconnectionError那我们拿数据时,不能直接拿,因为在我们拿资料前,网路很有可能会发生错误。
拿数据之前,应先判断错误
可以利用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); }