从NSHTTPURLResponse文档中,我没有找到获得HTTP版本(i.e. "HTTP/1.1" or "HTTP/1.0")的方法。
HTTP标头字段可以通过所有报头字段属性获得,但是HTTP协议版本不会在标头字段中给出,因为它不是HTTP标头。
注意: init,NSHTTPURLResponse初始化器(initWithURL:statusCode:HTTPVersion:headerFields:)确实需要HTTPVersion作为输入,所以理论上它可能已经保存在那里了。
但是,我找不到从给定响应获取HTTPVersion的属性或方法,例如,从NSURLSessionDataTask返回的响应。
发布于 2016-09-06 11:04:35
没有访问NSHTTPURLResponse实例的http版本的公共方式,响应的版本取决于请求版本。
如果您真的想访问http版本,可以使用CFNetworking。
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;您可以在一个_CFURLResponse实例上使用NSURLResponse getter方法获得这个结构:
CFTypeRef test = CFBridgingRetain([response performSelector:NSSelectorFromString(@"_CFURLResponse")]);
CFShow(test);发布于 2019-01-18 07:11:14
请不要使用_CFURLResponse私有API,因为CFNetwork没有提供任何关于其返回值格式的保证。
查询HTTP的推荐方法是实现URLSession:task:didFinishCollectingMetrics:委托方法
https://stackoverflow.com/questions/39343725
复制相似问题