В настоящее время требуется выполнить запрос аутентификации в API PredictHQ с использованием Alamofire.
Я сгенерировал учетные данные клиента в консоли разработчика и передал их в свой проект. Проблема заключается в том, что я использую URL-адрес https://api.predictq.com/oauth2/токен/ в своей функции *receiveJSONData() для получения сетевого статуса моих запросов.
Ниже приведены примеры, которые я использовал на веб-сайте PredictHQ https://developer.predictq.com/oauth2/ о том, как должен быть отформатирован запрос cURL.
1) I first created my networkServiceClient class
import UIKit
import Alamofire
class networkServiceClient {
private let token = "GENERATED_TOKEN_FROM_PREDICTHQ_API".data(using: String.Encoding.utf8)!.base64EncodedString()
private let secret = "GENERATED_SECRET_KEY_FROM_PREDICTHQ_API".data(using: String.Encoding.utf8)!.base64EncodedString()
private let id = "GENERATED_ID_FROM_PREDICTHQ_API".data(using: String.Encoding.utf8)!.base64EncodedString()
private let contentType = "application/json"
private var authURL = URL(string: "https://api.predicthq.com/oauth2/token/")
private var tokenDataURL = URL(string: "https://api.predicthq.com/v1/events/")
typealias webResponse = ([[String: Any]]?, Error?) -> Void
func receiveJSONData(completion: @escaping webResponse){
let loginString = String(format: "Basic %@:%@", id, secret)
let postHeaders:HTTPHeaders = ["Authorization": loginString, "Accept": contentType]
let params: [String : Any] = ["grant_type": "client_credentials", "scope": "account events signals"]
//post authentication request
AF.request(authURL!, method: .post, parameters: params, headers: postHeaders).responseJSON { (response) in
if let error = response.error {
completion(nil, error)
} else if let jsonArray = response.value as? [[String: Any]] {
completion(jsonArray, nil)
} else if let jsonDict = response.value as? [String: Any] {
completion([jsonDict], nil)
}
}
}
2) Then I implemented it in my TestingViewingController
import UIKit
import Alamofire
class TestingViewController: UIViewController {
private let networkingClient = networkServiceClient()
override func viewDidLoad() {
super.viewDidLoad()
networkingClient.receiveJSONData() { (json, error) in
if let error = error {
print(error.localizedDescription)
} else if let json = json {
print(json.description)
}
}
}
}
3) Lastly, here is my output in the TestingViewController console.
"error": invalid_client
Эй, это может быть потому, что вы кодируете base64 client_id и secret отдельно, но они должны быть закодированы вместе (разделенные двоеточием), как показано на снимке экрана.
Спасибо роб! Кодирование их отдельно сделало свою работу.