JSON Потоковая передача с использованием Alamofire Swift - PullRequest
5 голосов
/ 18 февраля 2020

Как запросить использование 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)
                }
        }

И мой URL-адрес API похож на

http: // {URL сервера} / services / data / {число chunks} / {items in per chunk}

и ответ, который я получаю от API, если количество чанков равно 3, а количество элементов в чанке равно 3

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

Я не сделал получить ответ от сервера, но в Почтальоне все работает нормально.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Чтобы получать потоковые данные, вы можете попробовать добавить

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
    }

0 голосов
/ 26 февраля 2020

Причиной сбоя вашего запроса может быть то, что вы используете responseJSON для анализа ответа, а ответ кажется недействительным json.

Возвращенные данные состоят из трех отдельных именованных массивов data, все расположено на верхнем уровне. Как это преобразовать в словарь или массив?

Можно ли изменить способ, которым сервер форматирует ответ, например, чтобы он возвращал один массив верхнего уровня с несколькими 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
        }
    ],
    [
        {
            "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
        }
    ],
    [
         {
            "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
        }
    ]
]

Если это невозможно, вместо этого проанализируйте ответ как строку, а затем используйте регулярное выражение для поиска каждого массива «данных» в строке, который затем можно проанализировать как JSON.

...