1

NSHTTPURLResponse文档中,我没有找到获取HTTP版本的方法(i.e. "HTTP/1.1" or "HTTP/1.0")

HTTP标头字段可通过所有 Header Fields 属性获得,但HTTP协议版本未在标头字段中给出,因为它不是HTTP标头。

注意: init,NSHTTPURLResponseinitializer (initWithURL:statusCode:HTTPVersion:headerFields:)确实需要HTTPVersion作为输入,所以理论上它可能已经保存在那里。

但是,我找不到HTTPVersion从给定响应中获取的属性或方法,例如从 NSURLSessionDataTask 返回的响应。

4

2 回答 2

3

没有公开的方式来访问NSHTTPURLResponse实例的 http 版本,响应的版本取决于请求的版本。

CFNetworking如果你真的想访问 http 版本,你可以使用。

CFN_EXPORT CFHTTPMessageRef 
CFHTTPMessageCreateResponse(
  CFAllocatorRef  __nullable alloc,
  CFIndex         statusCode,
  CFStringRef     __nullable statusDescription,
  CFStringRef     httpVersion)              CF_AVAILABLE(10_1, 2_0);

CFHTTPMessageCopyVersion()返回 HTTP 版本。

实际上-[NSHTTPURLResponse initWithURL:(NSURL *)URL statusCode:(NSInteger)statusCode HTTPVersion:(NSString *)version headerFields:(NSDictionary *)fields]用于CFHTTPMessageCreateResponse创建 HTTP 响应。见NSURLResponse.m

以结构NSURLResponse为后盾_CFURLResponse

typedef struct _CFURLResponse {
    CFRuntimeBase _base;
    CFAbsoluteTime creationTime;
    CFURLRef url;
    CFStringRef mimeType;
    int64_t expectedLength;
    CFStringRef textEncoding;
    CFIndex statusCode;
    CFStringRef httpVersion;
    CFDictionaryRef headerFields;
    Boolean isHTTPResponse;

    OSSpinLock parsedHeadersLock;
    ParsedHeaders* parsedHeaders;
} _CFURLResponse;

typedef const struct _CFURLResponse* CFURLResponseRef;

您可以在实例上使用_CFURLResponsegetter 方法获取此结构:NSURLResponse

CFTypeRef test = CFBridgingRetain([response performSelector:NSSelectorFromString(@"_CFURLResponse")]);
CFShow(test);
于 2016-09-06T11:04:35.743 回答
0

请不要使用_CFURLResponse私有 API,因为 CFNetwork 不对其返回值的格式提供任何保证。

查询 HTTP 版本的推荐方法是实现URLSession:task:didFinishCollectingMetrics:委托方法

https://developer.apple.com/documentation/foundation/nsurlsessiontasktransactionmetrics/1643141-networkprotocolname?language=objc

于 2019-01-18T07:11:14.133 回答