【问题标题】:How to use Alamofire with custom headers for POST request如何将 Alamofire 与自定义标头一起用于 POST 请求
【发布时间】:2015-04-16 02:19:57
【问题描述】:

我使用带有自定义标头的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)")
    }

【问题讨论】:

标签: swift post header afnetworking alamofire


【解决方案1】:

这是我如何将其与自定义标题一起使用的示例:

    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"
    ]

现在,无论您何时发出请求,它都会使用指定的标头。

您的代码已重构: 记得import 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 会处理其余的事情。

【讨论】:

  • 对于请求它会起作用,但答案不再起作用。你可以看到:stackoverflow.com/questions/25143938/…
  • 这是一种新的做法,而且很有效。阅读该链接中的旧答案部分,同时检查:github.com/Alamofire/Alamofire/issues/111 - Mattt 本人说“使用 HTTPAdditionalHeaders 属性”
  • 我会重构你的代码,以便我可以工作并发布它。
  • 您确定要连接的 API 返回 JSON 吗?
  • 我认为你是对的。它不是返回的 JSON。这是接口文档中的一个主要错误 :( 感谢您的帮助!!!
【解决方案2】:

对于 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
        }
    }

【讨论】:

    【解决方案3】:
    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 {
    
                }
        }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        • 2021-11-03
        • 2018-05-07
        相关资源
        最近更新 更多