gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:36:41 27 4
gpt4 key购买 nike

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

NSURLProtocol.registerClass(MyGreatProtocol)

然后我开始在网络 session 期间接收 MyGreatProtocol 中的事件。

假设我在注册我的协议(protocol)后创建 session ,

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 动词、 header 等都在那里。关于 body 性质的一些具体内容仍然难以捉摸。

为什么自定义 NSURLProtocol 中的 HTTP Body Nil?

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

最佳答案

下面是读取httpBody的示例代码:

swift 5

extension URLRequest {

func bodySteamAsJSON() -> Any? {

guard let bodyStream = self.httpBodyStream else { return nil }

bodyStream.open()

// Will read 16 chars per iteration. Can use bigger buffer if needed
let bufferSize: Int = 16

let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)

var dat = Data()

while bodyStream.hasBytesAvailable {

let readDat = bodyStream.read(buffer, maxLength: bufferSize)
dat.append(buffer, count: readDat)
}

buffer.deallocate()

bodyStream.close()

do {
return try JSONSerialization.jsonObject(with: dat, options: JSONSerialization.ReadingOptions.allowFragments)
} catch {

print(error.localizedDescription)

return nil
}
}
}

然后,在 URLProtocol 中:

override func startLoading() {

...

if let jsonBody = self.request.bodySteamAsJSON() {

print("JSON \(jsonBody)")

}

...
}

关于ios - 为什么 NSURLProtocol 子类中请求的 HTTPBody 始终为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36555018/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com