【问题标题】:The issue of Alamofire getting data with parametersAlamofire带参数获取数据的问题
【发布时间】:2017-08-29 06:32:27
【问题描述】:

我使用Alamofire从服务器获取数据,但是我使用parameters方法时无法获取任何数据,但可以获取完整的url(包括url中的2个参数)。 url格式:http://mobilecdnbj.kugou.com/new/app/i/search.php?cmd=302&keyword=%E5%88%98%E5%BE%B7%E5%8D%8E。 2个参数,一个是cmd = 302,另一个是keyword,需要用户输入。

我使用以下2种方法获取数据,但只有method 2可以获取数据:

方法一:

让 Search_Recommendation = "http://mobilecdnbj.kugou.com/new/app/i/search.php"

func getSearchRecommendation(keyword:String,success succeed:@escaping([String]) -> Void,failure fail:@escaping ((NSError)) -> Void){

        var recommendations = [String]()
        let parameters = ["cmd":302,"keyword":keyword] as [String : Any]
        let headers = ["Content-Type":"Application/json"]

        Alamofire.request(Search_Recommendation, method: HTTPMethod.get, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON { (response) in

            /** the following code is the same in the 2 methods*/

            if let json = response.result.value as? JSON{
                if let data = json["data"] as? [JSON]{
                    recommendations = data.map({
                        return (SearchRecommend.init(json: $0).keyword)!
                    })

                }
                succeed (recommendations)
            }else{
                fail(NSError())
            }

        }


    }

方法二:

让 Search_Recommendation = "http://mobilecdnbj.kugou.com/new/app/i/search.php?cmd=302&keyword="

 func getSearchRecommendation(keyword:String,success succeed:@escaping([String]) -> Void,failure fail:@escaping ((NSError)) -> Void){
    var recommendations = [String]()

    let url :String = Search_Recommendation + keyword.URLEncode()!

    Alamofire.request(url).responseJSON(completionHandler: { (response) in

            if let json = response.result.value as? JSON{
                if let data = json["data"] as? [JSON]{
                    recommendations = data.map({
                        return (SearchRecommend.init(json: $0).keyword)!
                    })

                }
                succeed (recommendations)
            }else{
                fail(NSError())
            }

        })

 }

URLEncode 方法:

  func URLEncode() -> String? {
            //self.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
            return self.addingPercentEncoding(withAllowedCharacters: NSCharacterSet(charactersIn: "!*'\"();:@&=+$,/?%#[]% ").inverted)
        }

不知道为什么方法1无法获取数据?如何解决?谢谢。 任何一点表示赞赏。

【问题讨论】:

    标签: ios json swift parameters alamofire


    【解决方案1】:

    看起来您使用了错误的编码。为了将参数附加到URL,假设使用URLEncoding.default

    替换这个:

    Alamofire.request(Search_Recommendation, method: HTTPMethod.get, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON
    

    有了这个:

    Alamofire.request(Search_Recommendation, method: HTTPMethod.get, parameters: parameters, encoding: URLEncoding.default, headers: headers).responseJSON
    

    JSONEncoding 实际上将参数附加到body 而不是url。因此,您的服务器无法处理它。使用上述方法,您将不再需要方法二。

    Alamofire 的 example and documentation 非常清楚,也许您想了解更多关于差异的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      相关资源
      最近更新 更多