Alamofire 是否支持分块数据响应?
Does Alamofire support chunked data response?
目前尚不清楚 Alamofire 是否支持大型或渐进式数据集的分块数据。这是我的应用程序非常需要的功能,否则我可能需要研究替代方法。
在 Alamofire Github 页面上,它指出 Progress Closure & NSProgress
但我不确定那意味着什么。
并根据 Wikipedia 上关于分块数据传输的描述。
Senders can begin transmitting dynamically-generated content before knowing the total size of that content.
为了清楚起见,让我解释一下我为什么需要这个。
基本上我有一个非常大的 JSON 文件,它被部分缓存了。完整的 JSON 文件由较小的 JSON objects 组成。我正在使用 iojs
/ nodejs
通过 res.write()
和 Express
发送分块数据,它知道不发送 Content-Length
header 并发送它作为分块数据。我已经通过 html/js
.
验证了这项工作
如果您想让我提供代码来演示这一点,请告诉我!
以下内容可能会有所帮助 -
https://github.com/Alamofire/Alamofire#downloading-a-file-wprogress
正在下载文件w/Progress
Alamofire.download(.GET, "http://httpbin.org/stream/100", destination: destination)
.progress { (bytesRead, totalBytesRead, totalBytesExpectedToRead) in
println(totalBytesRead)
}
.response { (request, response, _, error) in
println(response)
}
Alamofire 肯定支持 Transfer-Encoding: chunked
数据,因为 NSURLSession
已经支持它。这是从 httpwatch.com.
下载分块图像的快速示例
let request = Alamofire.request(.GET, "http://www.httpwatch.com/httpgallery/chunked/chunkedimage.aspx")
request.progress { bytesReceived, totalBytesReceived, totalBytesExpected in
println("\(bytesReceived) - \(totalBytesReceived) - \(totalBytesExpected)")
}
request.response { request, response, _, error in
println(request)
println(response)
println(error)
}
debugPrintln(request)
由于图像的内容长度不可用,totalBytesExpected
将始终报告为 -1
,因为它是未知的。 bytesReceived
和 totalBytesReceived
已正确报告。在我看来,分块下载可能不是尝试向用户显示下载进度的最佳选择,因为它的长度未定义。
另一个可能有用的功能是请求的新 stream
功能。它允许您在下载时存储每个数据块。
如果这些选项不能满足您的所有需求,请在我们的 Github 项目中提交您 运行 遇到的问题,以便我们进一步调查。
在 Alamofire 中处理分块响应的正确方法是使用 stream
:
let req = Alamofire.request("http://localhost:8080")
req.stream { (data) in
print(String(data: data, encoding: String.Encoding.utf8) ?? "No data")
}
目前尚不清楚 Alamofire 是否支持大型或渐进式数据集的分块数据。这是我的应用程序非常需要的功能,否则我可能需要研究替代方法。
在 Alamofire Github 页面上,它指出 Progress Closure & NSProgress
但我不确定那意味着什么。
并根据 Wikipedia 上关于分块数据传输的描述。
Senders can begin transmitting dynamically-generated content before knowing the total size of that content.
为了清楚起见,让我解释一下我为什么需要这个。
基本上我有一个非常大的 JSON 文件,它被部分缓存了。完整的 JSON 文件由较小的 JSON objects 组成。我正在使用 iojs
/ nodejs
通过 res.write()
和 Express
发送分块数据,它知道不发送 Content-Length
header 并发送它作为分块数据。我已经通过 html/js
.
如果您想让我提供代码来演示这一点,请告诉我!
以下内容可能会有所帮助 -
https://github.com/Alamofire/Alamofire#downloading-a-file-wprogress
正在下载文件w/Progress
Alamofire.download(.GET, "http://httpbin.org/stream/100", destination: destination)
.progress { (bytesRead, totalBytesRead, totalBytesExpectedToRead) in
println(totalBytesRead)
}
.response { (request, response, _, error) in
println(response)
}
Alamofire 肯定支持 Transfer-Encoding: chunked
数据,因为 NSURLSession
已经支持它。这是从 httpwatch.com.
let request = Alamofire.request(.GET, "http://www.httpwatch.com/httpgallery/chunked/chunkedimage.aspx")
request.progress { bytesReceived, totalBytesReceived, totalBytesExpected in
println("\(bytesReceived) - \(totalBytesReceived) - \(totalBytesExpected)")
}
request.response { request, response, _, error in
println(request)
println(response)
println(error)
}
debugPrintln(request)
由于图像的内容长度不可用,totalBytesExpected
将始终报告为 -1
,因为它是未知的。 bytesReceived
和 totalBytesReceived
已正确报告。在我看来,分块下载可能不是尝试向用户显示下载进度的最佳选择,因为它的长度未定义。
另一个可能有用的功能是请求的新 stream
功能。它允许您在下载时存储每个数据块。
如果这些选项不能满足您的所有需求,请在我们的 Github 项目中提交您 运行 遇到的问题,以便我们进一步调查。
在 Alamofire 中处理分块响应的正确方法是使用 stream
:
let req = Alamofire.request("http://localhost:8080")
req.stream { (data) in
print(String(data: data, encoding: String.Encoding.utf8) ?? "No data")
}