从 Objective-C 迁移到 Swift:AFNetworking > Alamofire
Posted
技术标签:
【中文标题】从 Objective-C 迁移到 Swift:AFNetworking > Alamofire【英文标题】:Migrating from Objective-C to Swift : AFNetworking > Alamofire 【发布时间】:2016-04-20 12:59:00 【问题描述】:我正在尝试将项目从 Obj-C 迁移到 Swift,但在这部分卡住了:
目标-C:
-(void) novoLogin:(NSDictionary *) parametros completionBlock:(void(^)(BOOL sucesso, NSDictionary *retorno)) completion
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
[manager GET:url parameters:parametros success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"Retorno:\n%@", responseObject);
if([responseObject isKindOfClass:[NSString class]])
responseObject = [self dictionaryFromString:responseObject];
NSString *error = responseObject[@"error"];
completion(error == nil, responseObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", operation.responseString);
completion(NO, @@"error" : operation.responseString);
];
到目前为止,这是我在 Swift 中的实现草案:
func doLogin(parameters: NSDictionary, completionHandler: (success: Bool, result: AnyObject?) -> Void)
guard let url = apiController.createURLWithComponentsForLogin() else
print("Invalid URL!")
return
print(url)
print("doLogin")
alamofireManager.request(.GET, url, parameters: parameters as? [String : AnyObject], encoding: .URL).responseJSON
(response) in
print(response.request)
print(response.response)
print(response.data)
print(response.result.value)
if let JSON = response.result.value
print("JSON result \(JSON)")
completionHandler(success: true, result: response.result.value)
它连接到一个 php 网络服务,我提供了一个电子邮件和密码作为参数,如果成功,我希望返回一个带有 "user_id":"424230" 的 json,如果失败则返回 "error":"Invalid data" .
这是我从这次测试中得到的回应:
Optional(<NSMutableURLRequest: 0x7a65ff70> URL: http://<hidden>/ws/index.php?r=webservice/ouvintes/login&email=awebmobile%40test.com&senha=123321 )
Optional(<NSHTTPURLResponse: 0x7a8bf8a0> URL: http://<hidden>/ws/index.php?r=webservice/ouvintes/login&email=awebmobile%2540test.com&senha=123321 status code: 200, headers
Connection = "Keep-Alive";
"Content-Encoding" = gzip;
"Content-Length" = 51;
"Content-Type" = "text/html";
Date = "Wed, 20 Apr 2016 12:36:44 GMT";
"Keep-Alive" = "timeout=5, max=100";
Server = Apache;
Vary = "Accept-Encoding";
)
Optional(<7b226572 726f7222 3a224461 646f7320 496e765c 75303065 316c6964 6f732e22 7d>)
Optional(
error = "Invalid data";
)
我提供了正确的电子邮件和密码...为什么我无法获得有效的 "id":"123456" 响应?我在这里错过了什么?
【问题讨论】:
【参考方案1】:尝试编码参数:
encodedEmail = emailString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
【讨论】:
嗨 Melifaro,感谢您抽出宝贵时间尝试帮助我。是的,如果我这样做:if let JSON = response.result.value print("JSON result \(JSON)") print(JSON["error"]!)
但是我应该得到一个 "id":"123456" 从服务器,因为我提供了正确的凭据。这就是我无法确定的...
很高兴知道。我已根据您的反馈更新了答案,现在它是正确的。
谢谢伙计!但这不是我的主要问题......我相信它与参数编码有关,因为我提供电子邮件,awebmobile@test.com,密码作为参数。我认为'@'是问题的原因。我应该从服务器返回一个 id:number 作为响应。简而言之,我的网址在添加参数后没有被正确“创建”。
表示你基本上需要对它进行编码。在答案中查看我的建议。它会起作用吗?
您的解决方案将电子邮件地址编码为“awebmobile%40.test.com”,如果我尝试直接在浏览器上使用它来测试端点,则可以接受,但使用 alamofire 请求它仍然返回一个错误:dados invalidos。我不明白为什么它没有按预期返回 id:123456...以上是关于从 Objective-C 迁移到 Swift:AFNetworking > Alamofire的主要内容,如果未能解决你的问题,请参考以下文章
将 Objective-C 代码迁移到 Swift(Swift 2.0更新)-b
将 Objective-C 核心数据迁移到 Swift 持久化容器
从 Swift 的 Objective-c 基础视图控制器继承