带有服务器发送事件的 URLSession 有时会返回 kCFErrorDomainCFNetwork 303

Pet*_*her 7 ios server-sent-events urlsession

在我们的应用程序中,我们通过服务器发送的事件请求信息流。为此,我们使用 引擎盖下使用的小型库IKEEventSourceFoundation.URLSession。

此信息以小型 JSON 包发送,例如:

{"type":"update","data":{"id":"1234","name":"someName","someOtherField":33,"size":"20","someAddress":"Awesome Street 111"}}

现在这对我们来说效果很好,但我们注意到有时会出现以下错误:

Error Domain=kCFErrorDomainCFNetwork Code=303 "(null)" UserInfo={NSErrorPeerAddressKey=<CFData 0x610000a84510 [0x103ccbe40]>{length = 16, capacity = 16, bytes = 0x100201bbb9131fbd0000000000000000}, _kCFStreamErrorCodeKey=-2201, _kCFStreamErrorDomainKey=4}

我理解的是kCFErrorHTTPParseFailure它试图解析的字符串似乎只是 JSON 包的一部分,例如:

{"type":"update","data":{"id":"1234","name":"so

我们目前的理解是,URLSession 正在缓冲数据,有时它会填满,最后一部分会被切掉。我们可以在终端中使用curl http://our.service.com并查看一个工作示例curl -N http://our.service.com

有人知道如何将此选项添加到URLSession,URLSessionConfiguration或URLSessionTask. 或者是否有人有其他解释或解决方案(可能是服务器端)由于此错误,我们的用户有时会错过对数据的更新,我们认为这是一些无法解释的反馈的原因。

顺便说一句,我们在相应的 Android 应用程序中遇到了同样的问题

Gui*_*ume 1

我遇到了同样的错误,没有使用任何库,只是使用我自己的实现URLSession。

我通过添加 HTTP 标头解决了这个问题Accept: text/event-stream。

    var request = URLRequest(url: url)
    request.setValue("text/event-stream", forHTTPHeaderField: "Accept")
Run Code Online (Sandbox Code Playgroud)