Alamofire - вызов API Rest с пользовательским заголовком - PullRequest
0 голосов
/ 16 мая 2018

Я работаю со Swift + Alamofire.Я использую Rest API, который возвращает данные в формате JSON, и я протестировал его в инструменте Rest API Testing, т.е. PostMan.Вот его снимок, и он работает нормально

Snapshot from PostMan

Единственный заголовок авторизации в этом запросе Get. Но то же самое не работает в Swift + Alamofire,Вот фрагмент кода.

let requestHeaders: HTTPHeaders = [
            "Authorization": "bearer " + (Session.user?.accessToken!)!
        ]
Alamofire.request("http://abcabc.com/api/StoreType/Stores", headers: requestHeaders).responseJSON { (response) -> Void in

            switch response.result {
            case .success:
                guard let rawJson = response.result.value as? [String: Any] else {

                    let serverError = NSError(domain: "Server error", code: (response.response?.statusCode)!, userInfo: ["msg": "Received Malformed data from server"])
                    errorBlock(serverError)
                    return
                }

                let formattedJson = JSON(rawJson)
                if (formattedJson["Message"] != JSON.null) {

                    let serverError = NSError(domain: "Server error", code: (response.response?.statusCode)!, userInfo: ["msg": formattedJson["Message"]])
                    errorBlock(serverError)
                } else { // No error case

                    Session.storeCategories = StoreCategory.initializeStoreCategoriesWithStores(storeCategoryList: formattedJson)
                    successBlock(formattedJson)
                }
            case .failure(let error):
                errorBlock(error)
            }
        }

Но я всегда получаю следующую ошибку.(Снимок из Xcode)

enter image description here

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Создайте пользовательский объект запроса типа URLRequest, установите URL, Headers и RequestType в своем объекте запроса, затем просто попросите Alamofire запустить этот запрос.

let requestHeaders: [String: String] = [
            "Authorization": "bearer " + (Session.user?.accessToken!)!
        ]
        if let url = URL(string: "https://www.example.com/someApiURL") {
            var request = URLRequest(url: url)
            request.httpMethod = "GET"
            request.headerParam = requestHeaders
            Alamofire.request(request).responseJSON{ (response) -> Void in

            switch response.result {
            case .success:
                guard let rawJson = response.result.value as? [String: Any] else {

                    let serverError = NSError(domain: "Server error", code: (response.response?.statusCode)!, userInfo: ["msg": "Received Malformed data from server"])
                    errorBlock(serverError)
                    return
                }

                let formattedJson = JSON(rawJson)
                if (formattedJson["Message"] != JSON.null) {

                    let serverError = NSError(domain: "Server error", code: (response.response?.statusCode)!, userInfo: ["msg": formattedJson["Message"]])
                    errorBlock(serverError)
                } else { // No error case

                    Session.storeCategories = StoreCategory.initializeStoreCategoriesWithStores(storeCategoryList: formattedJson)
                    successBlock(formattedJson)
                }
            case .failure(let error):
                errorBlock(error)
            }
    }
}
0 голосов
/ 16 мая 2018

Попробуйте, и для сопоставления классов ответов из json вы можете использовать Codable или ObjectMapper

var headers = ["":""]
headers["Authorization"] = "bearer " + (Session.user?.accessToken!)!
   Alamofire.request(baseURL + endpoint,headers: headers)
            .responseArray { (response: DataResponse<[Model]>) in
            print("Response: \(response)")

    }
0 голосов
/ 16 мая 2018

Ваш ответ имеет тип [[String: Any]], а не [String: Any].

Измените это на:

guard let rawJson = response.result.value as? [[String: Any]] else {
    let serverError = NSError(domain: "Server error", code: (response.response?.statusCode)!, userInfo: ["msg": "Received Malformed data from server"])
    errorBlock(serverError)
    return
}
...