IOS - Swift 4.0 - базовая аутентификация доступа с Alamofire - - PullRequest
0 голосов
/ 24 августа 2018

Я делаю приложение в Swift 4 i, когда дохожу до того, что мне нужно сделать POST-вызов, такой как «Базовая аутентификация доступа» с заголовком и телом с параметрами, у меня это не работает.

В основном я хочу смоделировать этот вызов, чтобы вернуть 200, но он возвращает меня:

"responseSerializationFailed (Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed (ошибка Domain = NSCocoaErrorDomain Code = 3840 "Недопустимое значение вокруг символа 0. "UserInfo = {NSDebugDescription = Недопустимое значение вокруг символа 0.}))"

URL-адрес API:

https://gist.github.com/juaniiton1/3a3e422ed99de22f3f3686bb3b7788d7

и раздел «Сохранить новую сделку в портфеле аутентифицированных пользователей».

Здесь я передаю код, имитирующий запрос «Сохранить новую сделку в портфеле авторизованных пользователей» с помощью Alamofire (4.7.3).

Следующие шаги следующие:

  • Что я делаю, так это кодирую данные "username" и "password", которые вы дай мне в base64.

  • Затем я форматирую дату типа Stirng для типа Date (тип ISO).

  • После того, как я создал словарь для данных

  • И наконец я создал запрос, соединив все вышеперечисленное.

  • Кроме того, в Xcode у меня есть TransportSecurity, чтобы сделать запрос "https"

Здесь я оставляю код:

Фонд импорта импорт UIKit импорт Alamofire

класс ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    //URL
    let url = URL(string: "https://test.cryptojet.io/coins/portfolio")!

    // credentials encoded in base64
    let username = "richard@rich.com"
    let password = "secret"
    let loginData = String(format: "%@:%@", username, password).data(using: String.Encoding.utf8)!
    let base64LoginData = loginData.base64EncodedString()
    let headers = ["Authorization" : "Basic \(base64LoginData)",
                   "Content-Type": "application/json"]

    //Prepare date - Data UTC to ISO
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
    let dataSting = "2016-06-05T16:56:57.019+01:00"
    let dateISO = dateFormatter.date(from: dataSting)

    //Prepare paramsBody -> tot Data
    let paramsBody: [String: Any] = ["coin_id": 2,
                                     "amount": -2.2183,
                                     "price_usd": 675.982,
                                     "traded_at": dateISO!]

    //Request
    Alamofire.request(url, method: .post,parameters: paramsBody, encoding: URLEncoding.default, headers: headers).responseJSON { response in
        switch response.result {
        case .success:
            guard let json = response.result.value as? [String: Any],
                let data = json["trade"] as? [String: Any] else {
                    return
            }
            print(data)
        case .failure(let error):
            print(error)
        }
    }

}

Не могли бы вы сказать, что я делаю не так с этим вызовом POST-аутентификации на сервере?

Ответы [ 2 ]

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

Если вы пытаетесь переварить, вам понадобится этот метод:

    credential = URLCredential(user: UserDefaults.standard.string(forKey: "userName") ?? "admin", password: UserDefaults.standard.string(forKey: "password") ?? "admin", persistence: .none)

    let sessionMananager = Alamofire.SessionManager.default
    _ = sessionMananager.request(url)
        .authenticate(usingCredential: credential!)
        .responseJSON { response in
 }
0 голосов
/ 24 августа 2018

Я попытался сделать запрос на ваш URL, и, кажется, ответ на ваш запрос не является JSON:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <meta name="robots" content="noindex,nofollow" />
        <style>            body { background-color: #F9F9F9; color: #222; font: 14px/1.4 Helvetica, Arial, sans-serif; margin: 0; padding-bottom: 45px; }

            a { cursor: pointer; text-decoration: none; }
            a:hover { text-decoration: underline; }
...
...