使用 Alamofire Swift 分块流式传输 JSON

标签 json swift swift3 alamofire

如何使用 Alamofire 请求获取流 JSON。我正在使用以下函数来获取响应

self.sessionManager?.request(url, method: methodType!, parameters: params, encoding: JSONEncoding.default, headers: headers)
            .validate()
            .responseJSON { (response) in
                if (response.result.error == nil) {
                    completion(response.result.value as AnyObject?, nil , response.response?.statusCode )
                } else {
                    // debugPrint("HTTP Request failed: \(String(describing: response.result.error))")
                    completion(nil, response.result.error, response.response?.statusCode)
                }
        }

我的 API Url 类似于

http://{server Url}/services/data/{number of chunks}/{items in per chunk}



如果块数为 3 且每个块的项目数为 3,我从 API 得到的响应
data: [
    {
        "invalidDraft": false,
        "bulkReserve": false,
        "srNo": 0,
        "returned": false,
        "status": "ACTIVE",
        "timestamp": 1580186026419,

    },
    {
        "invalidDraft": false,
        "bulkReserve": false,
        "srNo": 0,
        "returned": false,
        "status": "ACTIVE",
        "timestamp": 1580186026417,
    },
    {
        "invalidDraft": false,
        "bulkReserve": false,
        "srNo": 0,
        "returned": false,
        "status": "ACTIVE",
        "timestamp": 1580186026417,
    }
]

data: [
    {
        "invalidDraft": false,
        "bulkReserve": false,
        "srNo": 0,
        "returned": false,
        "status": "ACTIVE",
        "timestamp": 1580186026417,
    },
    {
        "invalidDraft": false,
        "bulkReserve": false,
        "srNo": 0,
        "returned": false,
        "status": "ACTIVE",
        "timestamp": 1580186026417,
    },
    {
        "invalidDraft": false,
        "bulkReserve": false,
        "srNo": 0,
        "returned": false,
        "status": "ACTIVE",
        "timestamp": 1580186026417,
    }
]

data: [
    {
        "invalidDraft": false,
        "bulkReserve": false,
        "srNo": 0,
        "returned": false,
        "status": "ACTIVE",
        "timestamp": 1580186026417,
    },
    {
        "invalidDraft": false,
        "bulkReserve": false,
        "srNo": 0,
        "returned": false,
        "status": "ACTIVE",
        "timestamp": 1580186026417,
    },
    {
        "invalidDraft": false,
        "bulkReserve": false,
        "srNo": 0,
        "returned": false,
        "status": "ACTIVE",
        "timestamp": 1580186026417,
    }
]

data:done

我没有得到服务器的任何响应,但在 Postman 中它工作正常。

最佳答案

要接收流数据,您可以尝试添加

request.stream(closure: { data in ... })

在闭包内部,您应该在调用响应后从服务器收集数据块并在最近解析它们。
在这种情况下,响应将为零。

所以它会是这样的:
let mData = NSMutableData()

self.sessionManager?
    .request(url, method: methodType!, parameters: params, encoding: JSONEncoding.default, headers: headers)
    .validate()       
    .stream(closure: { data in mData.append(data) })
    .response { response in
       //parse mData
    }

关于使用 Alamofire Swift 分块流式传输 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60274459/

相关文章:

ios - 使用 SpriteKit 制作 Logo 动画

ios - Swift 如何知道布局是否在 layoutIfNeeded() 之后完成

ios - Swift 3 - UITableView 在 UIScrollView 中被截断

Swift 启用点 - 使一个点再次可点击

ios - tableView 单元格有时会显示错误的图像?

iOs:(Swift 3)我用 var 变量初始化:[[Any]] = [],但出现错误消息 [type 'Any' has no subscript members]

javascript - 有没有办法将 javascript 对象视为 JSON?

JavaScript 通过选择选项对表数据进行排序

c++ - boost.property_tree 读取 json 预期的输入结束

c# - 在自定义 JsonConverter 中,如何确定 Utf8JsonReader 数字标记是小数还是长整型?