为什么NSURLProtocol子类中的请求的HTTPBody始终为零?

我有我的NSURLProtocol MyGreatProtocol 。 我将它添加到URL加载系统,

NSURLProtocol.registerClass(MyGreatProtocol)

然后我在网络会话期间开始接收MyGreatProtocol内部的事件。

假设我在注册我的协议后创建会话,

let session = NSURLSession.sharedSession()
    let request = NSMutableURLRequest(URL: NSURL(string:"http://example.com")!, cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 2.0) //arbitrary 404
    request.HTTPBody = ([1, 3, 3, 7] as [UInt8]).toNSData
    print("body data: (request.HTTPBody)") //prints `Optional(<01030307>)`
    request.HTTPMethod = "POST"
    session.dataTaskWithRequest(request) { (data, response, err) in
        print("data: (data)nresponse: (response)nerror(err)")
    }.resume()

我希望请求的HTTP正文1/3/3/7存在于MyGreatProtocol内部,而不是。

MyGreatProtocol内部,我重写了以下方法。

override class func canonicalRequestForRequest(request: NSURLRequest) -> NSURLRequest {
    print(request.HTTPBody) //prints nil
    return request
}

override class func canInitWithRequest(request: NSURLRequest) -> Bool {
    print(request.HTTPBody) //prints nil
    return true
}

override func startLoading() {
    print(self.request.HTTPBody) //prints nil
}

NSURLRequest的其他属性似乎被保留。 URL,HTTP动词,标题等都在那里。 关于身体性质的一些具体内容仍然难以捉摸。

为什么HTTP Body没有在自定义的NSURLProtocol中?

似乎有关于以前提交的雷达的一些类似讨论(即https://bugs.webkit.org/show_bug.cgi?id=137299)


IIRC,身体数据对象在到达您之前通过URL加载系统透明地转换为流式身体。 如果您需要阅读数据:

  • 打开HTTPBodyStream对象
  • 从中读取正文数据
  • 有一点需要注意:流可能不可回滚,因此请勿将该请求对象传递给任何其他需要访问主体的代码。 不幸的是,还没有请求新的主体流的机制(请参阅Apple网站上的CustomHTTPProtocol示例代码项目的README文件以了解其他限制)。

    链接地址: http://www.djcxy.com/p/34807.html

    上一篇: Why is the HTTPBody of a request inside an NSURLProtocol Subclass always nil?

    下一篇: Custom NSURLProtocol with NSURLSession