使用 Alamofire 设置 HTTP Headers 和 HTTP Body
Use Alamofire to Set HTTP Headers and HTTP Body
我一直在使用 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,但我无法让它工作..
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 测试版 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;
} })
您不必设置 Content-Type
或 Accept
。您也不必自己设置请求正文或使用 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 之类的工具中观察您的旧代码和新代码,并确定这两个请求的不同之处。
我一直在使用 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,但我无法让它工作..
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 测试版 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;
} })
您不必设置 Content-Type
或 Accept
。您也不必自己设置请求正文或使用 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 之类的工具中观察您的旧代码和新代码,并确定这两个请求的不同之处。