Alamofire - 使用自定义标头调用Rest API

时间:2018-05-16 12:10:13

标签: ios swift alamofire

我正在使用Swift + Alamofire。我正在使用Rest API以JSON格式返回数据,我在Rest API测试工具(即PostMan)中对其进行了测试。这是它的快照,它工作正常

Snapshot from PostMan

唯一的问题是此Get请求中的Authorization Header。但是在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 :(得分:1)

您的回复类型为[[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
}

答案 1 :(得分:0)

创建URLRequest类型的自定义请求对象,在您的请求对象中设置URLHeadersRequestType,然后只需要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)
            }
    }
}

答案 2 :(得分:0)

试试这个,对于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)")

    }