NSURLSession使用get发送参数

Ped*_*edi 13 parsing json dictionary swift

我正在尝试解析来自php的信息,但我需要发送一个字典参数,所以我尝试了一些东西......我看到了教程,例子但我被卡住了所以我回到了开头:(这是什么好方法这样做?)

       func asd(){
    let urlPath = "http://xxxxx.php"

    let url: NSURL = NSURL(string: urlPath)

    let request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "GET"
    var parm = ["id_xxxx": "900"] as Dictionary


    //I THINK MY PROBLEM IT'S HERE! i dont know how to link parm with session, i try is with session.uploadTaskWithRequest(<#request: NSURLRequest?#>, fromData: <#NSData?#>) but doesn't work

    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
        println("Task completed")
        if(error) {
            // If there is an error in the web request, print it to the console
            println(error.localizedDescription)
        }
        var err: NSError?
        var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
        if(err?) {
            // If there is an error parsing JSON, print it to the console
            println("JSON Error \(err!.localizedDescription)")
        }
        println(jsonResult.debugDescription)
        let results: NSArray = jsonResult["x"] as NSArray
        dispatch_async(dispatch_get_main_queue(), {
            self.tableData = results
            self.OfertaGridViewLista!.reloadData()
            })
        })
    task.resume()
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 12

GET数据需要是url查询字符串的一部分.有些方法会接受POST/PUT请求的参数字典,但是如果您使用的是GET方法,这些方法不会为您添加字典.

如果您希望将GET参数保存在字典中以保持清洁或一致性,请考虑在项目中添加如下方法:

func buildQueryString(fromDictionary parameters: [String:String]) -> String {
    var urlVars:[String] = []

    for (k, value) in parameters {
        if let encodedValue = value.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) {
            urlVars.append(k + "=" + encodedValue)
        }
    }

    return urlVars.isEmpty ? "" : "?" + urlVars.joinWithSeparator("&")
}
Run Code Online (Sandbox Code Playgroud)

此方法将获取键/值对的字典,并返回可附加到您的URL的字符串.

例如,如果您的API请求允许多个请求方法(GET/POST /等),您只需要将此查询字符串附加到您的基本API URL以获取GET请求:

if (request.HTTPMethod == "GET") {
    urlPath += buildQueryString(fromDictionary:parm)
}
Run Code Online (Sandbox Code Playgroud)

如果您只是发出GET请求,则无需检查您将使用哪种方法发送数据.


Ala*_*ino 6

有点疯狂,这里没有答案建议使用NSURLComponentsNSURLQueryItem对象。这是最安全,最现代的方法。

var iTunesSearchURL = URLComponents(string: "https://itunes.apple.com/search")!
iTunesSearchURL.queryItems = [URLQueryItem(name: "term", value: trackName),
                              URLQueryItem(name: "entity", value: "song"),
                              URLQueryItem(name: "limit", value: "1")]

let finalURL = iTunesSearchURL.url
Run Code Online (Sandbox Code Playgroud)


jav*_*sas 5

@ paul-mengelt在Objective C中的回答:

-(NSString *) buildQueryStringFromDictionary:(NSDictionary *)parameters {
    NSString *urlVars = nil;
    for (NSString *key in parameters) {
        NSString *value = parameters[key];
        value = [value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
        urlVars = [NSString stringWithFormat:@"%@%@=%@", urlVars ? @"&": @"", key, value];
    }
    return [NSString stringWithFormat:@"%@%@", urlVars ? @"?" : @"", urlVars ? urlVars : @""];
}
Run Code Online (Sandbox Code Playgroud)