Как я могу запустить два (2) HTTP POST-запроса, используя URLSession (Swift 4.2)? - PullRequest
0 голосов
/ 24 февраля 2019

Я создаю базовое мобильное приложение iOS для захвата изображения на устройстве камеры, подключившись напрямую через WiFI и используя HTTP POST REQUEST.

Для захвата изображения функция должна вызвать две (2) команды.Один (1) для активации затвора и один (1) для спуска затвора.Так что эту конкретную команду необходимо выполнить 2 раза последовательно.

Это формат ЗАПРОСА ПОСТА на камеру:

REQUEST TO TAKE A PICTURE
POST
camera_API_URL
{
"action": "half_press",
"af": “true”
}

REQUEST TO STOP TAKING A PICTURE
POST
camera_API_URL
{
"action": "release",
"af": “false”
}

Сначала я проверяю, могу ли я получить информацию оустройство:

    guard let url = URL(string: "camera_API_URL") else { return }

        let session = URLSession.shared
        session.dataTask(with: url) { (data, response, error) in
        if let response = response {
            print(response)
        }

        if let data = data {
            print(data)
            do {
                let json = try JSONSerialization.jsonObject(with: data,   options: [])
                print(json)
            } catch {
                print(error)
            }
        }
       }.resume()

Это дает следующий ответ данных JSON:

<NSHTTPURLResponse: 0x283bb96c0> { URL: camera_API_URL } { Status Code: 200,   Headers {
"Content-Length" =     (
    199
);
"Content-Type" =     (
    "application/json"
);
} }
199 bytes
{
firmwareversion = "1.0.1";
guid = 1q2w3e4r5t6y7u8i9o0p;
macaddress = "04:1f:2e:12:1d:93";
munufacturer = "Some Company";
productname = "DSLR Camera Name";
serialnumber = 1234567890;
}

Затем я продолжаю выполнять первый триггер:

    let parametersOpenShutter = ["action": "half_press", "af": "true"]
    let parametersCloseShutter = ["action": "release", "af": "false"]

    guard let url = URL(string: "camera_API_URL") else { return }

    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    guard let httpBody = try? JSONSerialization.data(withJSONObject: parametersOpenShutter, options: []) else { return }
    request.httpBody = httpBody

    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in
        if let response = response {
            print(response)
        }

        if let data = data {
            do {
                let json = try JSONSerialization.jsonObject(with: data, options: [])
                print(json)
            } catch {
                print(error)
            }
        }

        }.resume()

Это приводит к следующемуОтвет JSON:

<NSHTTPURLResponse: 0x2825bfa80> { URL: camera_API_URL } { Status Code: 400,   Headers {
"Content-Length" =     (
    31
);
"Content-Type" =     (
    "application/json"
);
} }
{
message = "Invalid parameter";
}

Я не уверен, что делаю неправильно, чтобы получить неверный параметр.

Пожалуйста, проверьте.

Как мне кодировать приложение, чтобы выполнить (2) HTTP POST ЗАПРОСЫ последовательно открывать и закрывать затвор?

1 Ответ

0 голосов
/ 24 февраля 2019

Используйте DispatchGroup () для решения вашей проблемы.Я постараюсь дать пример кода ниже:

//Create a dispatch group
let group = DispatchGroup()
//Make first web service call
group.enter()
webservice.firstCall { (response, error) in
    //.....handle the response
    group.leave()
} 
//Make second web service call
group.enter()
webservice.secondCall { (response, error) in
    //.... handle the response
    group.leave()
} 

// Add the observer when all the tasks in the group are completed.
group.notify(queue: .main) { [weak self] in
   //Handle completion of web service calls
}
...