iOS curl -X POST интеграция в Swift - PullRequest
0 голосов
/ 04 ноября 2018

Привет, я хочу интегрировать API Curl POST в мой код. Я не имею ни малейшего представления об этом, может, подскажите, пожалуйста, как интегрировать это на быстром языке

Приведенный ниже вызов веб-службы, который я включил в свой код, пытался, но не получил результат

curl -X POST http://stf.rortechnologies.com/api/session.js --data '{"user": {"email": "XXXXXX", "password": "XXXXXX"}}' -H "Тип содержимого: приложение / JSON "

    let parameters = ["email":"admin.test@stf.com", "password":"password"]

    let header = ["user": parameters]
    //create the url with URL
    let url = URL(string: "http://stf.rortechnologies.com/api/session.js")! //change the url

    //create the session object
    let session = URLSession.shared

    //now create the URLRequest object using the url object
    var request = URLRequest(url: url)
    request.httpMethod = "POST" //set http method as POST

    do {
        request.httpBody = try JSONSerialization.data(withJSONObject: header, options: .prettyPrinted) // pass dictionary to nsdata object and set it as request body
    } catch let error {
        print(error.localizedDescription)
    }

    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    //create dataTask using the session object to send data to the server
    let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in

        guard error == nil else {
            return
        }

        guard let data = data else {
            return
        }

        do {
            //create json object from data
            if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                print(json)
                // handle json...
            }
        } catch let error {
            print(error.localizedDescription)
        }
    })
    task.resume()

здесь я получаю нулевой ответ

1 Ответ

0 голосов
/ 04 ноября 2018

App Transport Security (ATS)

Вы звоните по URL-адресу http, а не по URL-адресу https. В производстве всегда следует использовать https. Это обеспечивается iOS.

Для целей тестирования можно объявить исключения в info.plist, документацию можно найти здесь: https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33

JSON-кодирование / декодирование

В Swift есть удобный способ кодирования / декодирования JSON с помощью JSONEncode / JSONDecoder. Простое решение может выглядеть так, как показано ниже.

Определение структур параметров

struct Login: Encodable {
    let user: User
}

struct User: Encodable {
    let email: String
    let password: String
}

Определение структуры возврата

struct Result: Decodable {
    //add expected JSON fields here
}

Отдых Звоните

private func makeRestCall() {

    let login = Login(user: User(email: "admin.test@stf.com", password: "password"))
    guard let loginJson = try? JSONEncoder().encode(login) else { return }

    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)

    guard let url = URL(string: "<add some valid url here>") else { return }
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = loginJson

    let dataTask = session.dataTask(with: request) { (data, response, error) in

        if let response = response as? HTTPURLResponse {
            if response.statusCode == 200 {
                guard let data = data else {
                    print ("call failed - no data returned")
                    return
                }
                guard let result = try? JSONDecoder().decode(Result.self, from: data) else {
                    print ("json decoding failed")
                    return
                }
                print ("call succesfully returned \(result)")
            } else {
                print ("call failed with status \(response.statusCode)")
            }
        } else {
            print ("call failed: no http response")
        }
    }

    dataTask.resume()

}

Регистрация в HTTPS-прокси

Чтобы убедиться, что вы отправляете правильные данные, вы можете использовать прокси-программу HTTPS. Там это будет выглядеть так:

check in proxy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...