使用 Alamofire 设置 HTTP Headers 和 HTTP Body

Posted

技术标签:

【中文标题】使用 Alamofire 设置 HTTP Headers 和 HTTP Body【英文标题】:Use Alamofire to Set HTTP Headers and HTTP Body 【发布时间】:2015-09-10 11:19:33 【问题描述】:

我一直在使用 NSURLConnection 发出请求,我想将代码迁移到 Alamofire。

这是我的 NSURLConnection 代码。

var requestString: NSString = "http://api.domainname.com/api/v1/auth/register";
var url: NSURL = NSURL(string: requestString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)!;

var urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: url);
urlRequest.setValue("\(base64LoginString)", forHTTPHeaderField: "Authorization");
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type");
urlRequest.setValue("application/json", forHTTPHeaderField: "Accept");

var httpBodyDictionary: NSMutableDictionary = NSMutableDictionary();
httpBodyDictionary.setObject(self.emailTextField.text, forKey: "email");
httpBodyDictionary.setObject(self.usernameTextField.text, forKey: "username");
httpBodyDictionary.setObject(self.passwordTextField.text, forKey: "password");

urlRequest.HTTPMethod = "POST";

NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue(), completionHandler:  (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
    if(data != nil) 
          //PROCESS DATA
    
);

我尝试过 Alamofire,但我无法让它工作..

阿拉莫火

var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ?? [:]
defaultHeaders["Authorization"] = "\(base64LoginString))"
defaultHeaders["Content-Type"] = "application/json)"
defaultHeaders["Accept"] = "application/json)"

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = defaultHeaders;

let manager = Alamofire.Manager(configuration: configuration)


var requestString: NSString = "http://api.domainname.com/api/v1/auth/register";
var url: NSURL = NSURL(string: requestString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)!;

var urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: url);
urlRequest.HTTPMethod = Alamofire.Method.POST.rawValue;

let parameters = ["email": self.emailTextField.text,
        "username": self.usernameTextField.text,
        "password": self.passwordTextField.text]

do 
        urlRequest.HTTPBody = try NSJSONSerialization.dataWithJSONObject(parameters, options: NSJSONWritingOptions())
 catch 
    // No-op


Alamofire.request(urlRequest).responseJSON(completionHandler:  (urlRequest, urlResponse, result) -> Void in
        print(urlResponse);        
    //print(result);
)

请有人指出正确的方向吗?我花了一整天的时间试图让它发挥作用。

注意:使用 Swift 2/XCode 7 Beta 6

UPDATE 尝试了 Rob 的建议,但我得到了返回,当我使用 NSURLConnection 时不会发生这种情况

打印的回复

Optional(<NSHTTPURLResponse: 0x7fdbc222a2b0>  URL: http://api.domainname.com/api/v1/auth/register   status code: 422, headers 
    "Cache-Control" = "no-cache, proxy-revalidate";
    Connection = "Keep-Alive";
    "Content-Type" = "application/json";
    Date = "Thu, 10 Sep 2015 14:35:13 GMT";
    Server = "nginx/1.8.0";
    "Set-Cookie" = "laravel_session=eyJpdiI6InZjSVwvcVd3NjR6SitZSlZNMGdXdElRPT0iLCJ2YWx1ZSI6IjJBeXdWTHRlRUNQa2RTSFBDYlU0bWlBRkF3c0pzcEx2YzQxdXk0ZnlxZ2xERUkrWmFZNlNISUlyZmpnWjZkamdxVFJXaGxOQmFtVlZZWElWdnFYdlBRPT0iLCJtYWMiOiI5MWY2NjU4ODViYjhlYWM4N2YwOTg2ZTA2OWYzNmU1MmE3ZWEzN2E5ZTA5ZjA5YjMyYmExN2FmMzFhZjRiMmJhIn0%3D; expires=Thu, 10-Sep-2015 16:35:13 GMT; Max-Age=7200; path=/; httponly";
    "Transfer-Encoding" = Identity;
 )

【问题讨论】:

顺便说一句,在您的 Alamofire 尝试中,您在所有三个标题中都有额外的 ) 字符。这可能没有实际意义,因为可能需要进行更戏剧性的简化,但仅供参考。 状态码 422 表示“无法处理的实体”,即请求在语法上正确,但语义不正确(简而言之,错误的数据格式正确)。我建议在Charles 中观看成功的NSURLConnection 请求,然后用Alamofire 重复它,看看这两个请求有何不同。 【参考方案1】:

您不必设置Content-TypeAccept。您也不必自己设置请求正文或使用NSJSONSerialization。 Alamofire 让您摆脱构建请求的麻烦。所以你可能会这样做:

let requestString = "http://api.domainname.com/api/v1/auth/register"

let parameters = [
    "email"    : emailTextField.text!,
    "username" : usernameTextField.text!,
    "password" : passwordTextField.text!
]

let headers = ["Authorization": base64LoginString]

Alamofire.request(.POST, requestString, parameters: parameters, encoding: .JSON, headers: headers).responseJSON  request, response, result in
    print(response)

或者,如果您不想自己构建base64LoginString,您也可以执行以下操作:

Alamofire.request(.POST, requestString, parameters: parameters, encoding: .JSON)
    .authenticate(user: user, password: password)
    .responseJSON  request, response, result in
        print(response)

如果仍然无法正常工作,我建议 (a) 编辑您的问题,分享准确的错误消息; (b) 在Charles 之类的工具中观察您的旧代码和新代码,并确定这两个请求的差异程度。

【讨论】:

感谢您抽出宝贵时间回答。真的很感激。但是还是不行。 在使用您建议的代码后,我已经用回复编辑了我的问题。有什么想法吗?

以上是关于使用 Alamofire 设置 HTTP Headers 和 HTTP Body的主要内容,如果未能解决你的问题,请参考以下文章

在操场上使用 Alamofire 发出 http 请求的延迟

使用 Alamofire 的无效证书、表单数据和 HTTP 标头数据

使用 AlamoFire 发出 HTTP 请求会导致 EXC_BAD_ACCESS

Alamofire 无法在默认设置下创建用户代理

如何使用 Alamofire 为 http 请求编写单元测试?

使用 Alamofire 的 Http 请求