Нет ответа от быстрого почтового запроса - PullRequest
2 голосов
/ 16 января 2020

Нужно сделать почтовый запрос для завершения аутентификации oauth2.0.

Он отлично работает в curl:

curl -i -X POST -H 'Content-Type: application/x-www-form-urlencoded' -d 'clientId=cgoxyBxM1KVO3pLm5J7VgDVxlP7_33BpPlPXeIaSmoLsTZq8DfyM1svTwi-SU7KJKBRN4V3mIsV7pNNEg610Xw' https://fmsauth.scania.com/auth/S2S4DA/ClientId2Challenge

Я получаю такой ответ:

{"challenge":"_jEEFcI36cvfMac8BHG8R0iIp4g7I-t0-C9LKAjwl9Y"}

Я пытаюсь сделать то же самое в swift, но я получаю нулевой ответ:

import Foundation

let session = URLSession.shared
let url = URL(string: "https://fmsauth.scania.com/auth/S2S4DA/ClientId2Challenge")!

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
let payload = Data("clientId=cgoxyBxM1KVO3pLm5J7VgDVxlP7_33BpPlPXeIaSmoLsTZq8DfyM1svTwi-SU7KJKBRN4V3mIsV7pNNEg610Xw".utf8)

let task = session.uploadTask(with: request, from: payload) { data, response, error in

    if let data = data, let dataString = String(data: data, encoding: .utf8) {
        print(dataString)
    }

    if let httpResponse = response as? HTTPURLResponse {
        print(httpResponse.statusCode)
    }
}

task.resume()

Я думаю, что может быть проблема со строкой данных полезной нагрузки. Я не знаю, как http-запрос «формат данных» выглядит в curl и swift.

1 Ответ

0 голосов
/ 16 января 2020

Обновление 1

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

Вы можете использовать семафор, чтобы заблокировать текущий поток и дождаться окончания сеанса URL-адреса sh.

Семафор отправки - эффективная реализация традиционного считая семафор Отправка семафоров обращаются к ядру только тогда, когда вызывающий поток должен быть заблокирован. Если вызывающий семафор не нуждается в блокировке, вызов ядра не производится. Apple

Этот код будет делать то, что вы хотите.

var sema = DispatchSemaphore( value: 0 )
let session = URLSession.shared
let url = URL(string: "https://fmsauth.scania.com/auth/S2S4DA/ClientId2Challenge")!

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
let payload = Data("clientId=cgoxyBxM1KVO3pLm5J7VgDVxlP7_33BpPlPXeIaSmoLsTZq8DfyM1svTwi-SU7KJKBRN4V3mIsV7pNNEg610Xw".utf8)

    let task = session.uploadTask(with: request, from: payload) { data, response, error in

        if let data = data, let dataString = String(data: data, encoding: .utf8) {
            print(dataString)
             sema.signal()
        }

        if let httpResponse = response as? HTTPURLResponse {
            print(httpResponse.statusCode)
        }
    }

    task.resume()
    sema.wait()

Первое сообщение

Ваш код работает, я думаю, вам нужно включить транспорт. Добавьте это в info.plist

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>somethingthatshouldntworkyourdomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

Response

Code 200

{"challenge":"eeABaKaf2ZdhPEVQ4ru2S58_j37VLetM3pryIP8uiXk"}
<NSHTTPURLResponse: 0x600003be73e0> { URL: https://fmsauth.scania.com/auth/S2S4DA/ClientId2Challenge } { Status Code: 200, Headers {
    "Content-Encoding" =     (
        gzip
    );
    "Content-Length" =     (
        182
    );
    "Content-Type" =     (
        "application/json; charset=utf-8"
    );
    Date =     (
        "Wed, 15 Jan 2020 21:12:31 GMT"
    );
    Server =     (
        "Microsoft-IIS/8.5"
    );
    "Set-Cookie" =     (
        "BIGipServerfmsauth.scania.com_https_pool=!c+BZzlVtgeV0E7NCFLoANbUAp39TaIJT2kJgIPLs8cCAJ4R4UMhNbWVOiSnTd/Cx6OuLMGUfIpke3g==; path=/; Httponly; Secure"
    );
    Vary =     (
        "Accept-Encoding"
    );
    "X-HandlingWebServer" =     (
        sesofms9112
    );
    "X-Powered-By" =     (
        "ASP.NET"
    );
    "owin.RequestId" =     (
        "4dbeb043-0e55-4972-b955-45c28f94aa77"
    );
} }
...