带有 NSURLSession 的 Http/2 server_push
Posted
技术标签:
【中文标题】带有 NSURLSession 的 Http/2 server_push【英文标题】:Http/2 server_push with NSURLSession 【发布时间】:2016-09-19 23:39:47 【问题描述】:我已经实现了一个使用ios9的NSURLSession进行http2通信的程序,它可以在http2中与我的服务器通信。 但是,我在接收server_push 时遇到问题。 我发现他们的设置中的 ENABLE_PUSH 值为 0,并且在 NSURLSession 中接收服务器推送中没有委托...
·我认为 NSURLSession 不支持 server_push。是这样吗?
・如果支持server_push,如何使用?
/**
It WORKS for post data and get response.
I don't know the code should be added here
in order to get the server_push.
I suspect that NSURLSession itself cannot receive the server_push(;_;)
**/
- (void) postData
NSString *urlstr = self.urlArea.text;
NSURL * url = [NSURL URLWithString:urlstr];
NSDictionary *params = @@"data":@"";
//json to query
NSData *query = [self buildQueryWithDictionary: params];
//make request
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:url
cachePolicy: NSURLRequestReloadIgnoringCacheData
timeoutInterval: 10.0];
[request setHTTPMethod: @"POST"];
[request setHTTPBody: query];
//prepare session
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//resume
[[session dataTaskWithRequest: request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
if (response && ! error)
NSLog(@"Data: %@", [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]);
else
NSLog(@"ERR: %@", error);
] resume];
【问题讨论】:
嗨 T_ms,欢迎来到 SO。您应该发布您的代码,并详细说明您遇到了什么样的接收问题。 嗨,J.Chomel,感谢您的建议:-) 我发布了! 【参考方案1】:我读到了这个here:
HTTP2 推送机制不是一个通用的服务器推送机制,例如 websocket 或服务器发送的事件。
它专为 HTTP 会话的特定优化而设计。 特别是当客户端请求资源(例如 index.html)时 服务器可以猜测它接下来会要求一堆 相关资源(例如 theme.css、jquery.js、logo.png 等) 通常一个网页可以有 10 个这样的关联请求。
使用 HTTP/1.1,服务器必须等到客户端真正发送 请求这些关联资源,然后客户端受限 通过连接一次只要求大约 6 个。因此可以采取 在所需的所有相关资源之前进行多次往返 由网页实际发送。
使用 HTTP/2,服务器可以在响应中发送 index.html GET push 承诺告诉客户它也将发送 theme.css、jquery.js、logo.png 等,好像是客户端请求的 他们。然后客户端可以取消这些推送或只是等待它们 发送时不会产生多次往返的额外延迟。
这是一篇关于 jetty 中 HTTP2 和 SPDY 的推送 API 的博客: https://webtide.com/http2-push-with-experimental-servlet-api/
【讨论】:
感谢您的信息!你能告诉我你是否知道 NSURLSession 支持这个吗? 是的.....并且 HTTP/2 支持是 iOS 9 的一部分,因此在早期的操作系统版本中不可用。 嗯...我可以看到只有iOS9(或更高版本)支持Http/2...但不知道iOS9的cocoa API是否有SURVER_PUSH的功能...> 【参考方案2】:解决了
我收到了支持人员的以下回复。
iOS 目前不支持此功能。
更新
(@vin25 评论)
ios10 支持。
【讨论】:
这有什么更新吗? iOS 10 是否添加了对此的支持? 最近发现 iOS 10 确实支持它。请参阅 NSURLSession-developer.apple.com/videos/play/wwdc2016/711 上的 WWDC 2016 视频。我已经对其进行了测试,并且效果很好!以上是关于带有 NSURLSession 的 Http/2 server_push的主要内容,如果未能解决你的问题,请参考以下文章
带有 NSURLSession 的 Swift 中的 HTTP 请求
使用带有参数的 NSURLSession (HTTP POST) 下载 PDF