从 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 基础视图控制器继承

Swift 类的 Objective-c 协议。无法识别的方法

Swift学习: 从Objective-C到Swift

从 Objective-C 到 Swift 的 Swift 传递块