如何在POST请求中使用自定义头部与Alamofire

29

我使用Alamofire实现了一个带有自定义头的POST请求,因为我们使用OAuth2并且需要在每个请求中的头部发送访问令牌。在这种情况下,我必须使用自定义头。

对于HTTP头字段Authorization的访问令牌值对我不起作用。服务器生成错误,因为OAuth与访问令牌的标头信息不可用。

但我的代码错在哪里呢?

以下是我的当前代码:

let URL =  NSURL(string: url + "/server/rest/action")
var mutableURLRequest = NSMutableURLRequest(URL: URL!)
mutableURLRequest.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")

//this method does not work anymore because it returns an error in the response
//Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders = ["Authorization": "Bearer \(accessToken)"]

Alamofire.Manager.sharedInstance
    .request(.POST, mutableURLRequest, parameters: parameters, encoding: .JSON)
    .validate()
    .responseJSON {
                (request, response, data, error) -> Void in

                NSLog("REQUEST: \(request)")
                NSLog("RESPONSE: \(response)")
                NSLog("DATA: \(data)")
                NSLog("ERROR: \(error)")
    }

被接受的答案似乎已经过时了。 请查看我的答案:https://dev59.com/hl8e5IYBdhLWcg3w_-n0#40000918 - Nhat Dinh
4个回答

45
这是我如何与自定义标头一起使用它的示例:
    var manager = Manager.sharedInstance
    // Specifying the Headers we need
    manager.session.configuration.HTTPAdditionalHeaders = [
        "Content-Type": "application/x-www-form-urlencoded",
        "Accept": "application/vnd.lichess.v1+json",
        "X-Requested-With": "XMLHttpRequest",
        "User-Agent": "iMchess"
    ]
现在,每当您发出请求时,它将使用指定的标头。
您重构的代码: 记得导入 Alamofire。
    let aManager = Manager.sharedInstance
    manager.session.configuration.HTTPAdditionalHeaders = [
        "Authorization": "Bearer \(accessToken)" ]

    let URL =  url + "/server/rest/action"

    request(.POST, URL, encoding: .JSON)
        .responseJSON {
            (request, response, data, error) -> Void in

            println("REQUEST: \(request)")
            println("RESPONSE: \(response)")
            println("DATA: \(data)")
            println("ERROR: \(error)")
    }

这是请求签名 request(method: Method, URLString: URLStringConvertible>, parameters: [String : AnyObject]?, encoding: ParameterEncoding)

正如您所看到的,您无需传递NSURL,只需要URL的字符串即可,Alamofire会处理其余部分。


对于请求,它可以工作,但是答案不再适用。您可以查看:https://dev59.com/hl8e5IYBdhLWcg3w_-n0 - Karl
这是新的做法,它有效。请阅读该链接中的旧答案部分,还要检查:https://github.com/Alamofire/Alamofire/issues/111 - Mattt本人说“使用HTTPAdditionalHeaders属性”。 - leonardo
我会重构你的代码,使其能够正常运行并发布。 - leonardo
你确定你连接的API返回的是JSON格式吗? - leonardo
2
我认为你是正确的。它不是返回JSON。这是接口文档中的一个重大错误 :( 谢谢你的帮助!!! - Karl

5

对于Swift 3和Alamofire 4.0,有一个简单的解决方案可以通过单个Alamofire请求发送参数和标题。

    let url = "myURL"
    let parameters: Parameters = [
        "param1": "hello",
        "param2": "world"
    ]
    let headers = [
        "x-access-token": "myToken",
    ]

    Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON { (response) in
        if response.result.isFailure {
            //In case of failure
        }else {
            //in case of success
        }
    }

1
从 Alamofire 5.0.0 开始,您可以使用类型为 HTTPHeader 的集合添加自定义 HTTP 标头。因此,要添加自定义用户代理标头,您可以按如下方式操作:urlRequest.headers.add(.userAgent("Custom User Agent Here"))

0
let headers: HTTPHeaders = [
        "Cookie": UserDefaultsUtil.getString(param: Constants.COOKIE),
        "Accept": "application/json"
    ]

Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers)
        .responseObject { (response: DataResponse<Any>) in
            if response.result.isSuccess {

            }
            else {

            }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接