我使用Alamofire
从服务器获取数据,但是当我使用参数方法时我无法获取任何数据,而它可以获得完整的URL(包括url中的2个参数) 。
网址格式: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
,需要用户输入。
我使用以下两种方法来获取数据,但只有method 2
才能获取数据:
方法1:
让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())
}
}
}
方法2:
让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无法获取数据?如何解决?谢谢。 任何一点都值得赞赏。
答案 0 :(得分:2)
看起来你使用了错误的编码。要将参数附加到user
,请假设使用many-to-many
。
替换它:
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
。因此,您的服务器无法处理它。使用上述方法,您将不再需要方法二。
Alamofire的example and documentation非常清楚,也许您想更多地了解差异。