NSUrlConnectionDelegate - 获取HTTP状态码

35
在iOS中,如何从Web服务器响应中接收HTTP状态码(404、500、200等)?我假设它在NSUrlConnectionDelegate中。
Objective-C或Monotouch .NET的答案都可以。

1
可能是https://dev59.com/w1TTa4cB1Zd3GeqPpiS1的重复。 - csano
编辑后的问题要求翻译与Monotouch相关的编程内容。 - Ian Vink
4个回答

88

是的,你可以在代理方法-didRecieveResponse:中获取状态码。

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
   NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
   int code = [httpResponse statusCode];
}

2
请注意,尽管使用了点符号表示法,但statusCode不是一个属性。 - albertamg
2
@albertamg,确实犯了错误...谢谢,我会更正以避免混淆。 - Vladimir
2
我意识到这很明显,但为了完整起见,我会记录一下:在任何其他情况下,您通过HTTP请求获得NSURLResponse(例如sendAsynchronousRequest:queue:completionHandler:的完成处理程序),您可以以完全相同的方式将NSURLResponse转换为NSHTTPURLResponse - Mark Amery

11
NSHTTPURLResponse* urlResponse = nil;
NSError *error = nil;
responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
请求还应该有一种获取NSHTTPURLResponse的方式...

您可以像这样获取状态码:

int statusCode = [urlResponse statusCode];
int errorCode = error.code;

对于一些经常使用的错误码(如404),它们会出现在错误中,但是会有不同的代码表示(401将变为-1012)。


1
没有必要分配错误 - 只需在返回时检查错误是否不为 null - 如果不是,则应该有一个错误代码。 - gheese
非常感谢,那帮了我大忙。谢谢你提供的401错误信息,正是我想要捕获的错误。错误代码为-1012,就像你所说的一样。 - John Ballinger

3

以下是针对使用C#的MonoTouch for .NET用户的操作步骤,在NSUrlConnectionDelegate中实现。

public override void ReceivedResponse (NSUrlConnection connection, NSUrlResponse response)
{
  if (response is NSHttpUrlResponse)
  {
    var r = response as NSHttpUrlResponse;
    Console.WriteLine (r.StatusCode);
   }
}

1

这个其他的stackoverflow问题看来,你可以在- (void)connection:(NSURLConnection *)aConnection didReceiveResponse:(NSURLResponse *)response代理方法中处理HTTP状态码:

- (void)connection:(NSURLConnection *)aConnection didReceiveResponse:(NSURLResponse*)response 
{
    if ([response isKindOfClass: [NSHTTPURLResponse class]])
        statusCode = [(NSHTTPURLResponse*) response statusCode];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接