使用 Alamofire Swift 分块流式传输 JSON

Raj*_*hta 6 json swift alamofire swift3

如何使用 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)
                }
        }
Run Code Online (Sandbox Code Playgroud)

我的 API Url 类似于

http://{server Url}/services/data/{块数}/{每个块中的项目数}

如果块数为 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
Run Code Online (Sandbox Code Playgroud)

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

小智 3

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

request.stream(closure: { data in ... })
Run Code Online (Sandbox Code Playgroud)

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

所以它会是这样的:

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
    }

Run Code Online (Sandbox Code Playgroud)