Подтвердить что ты не робот

NSURLSession отправляет параметры с помощью get

Я пытаюсь разобрать информацию из 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 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()
}

Спасибо!

4b9b3361

Ответ 1

Данные GET должны быть частью строки запроса url. Некоторые методы будут принимать словарь параметров для запросов POST/PUT, но эти методы не будут добавлять словарь к URL-адресу для вас, если вы используете метод 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("&")
}

Этот метод примет словарь пар ключ/значение и вернет строку, которую вы можете добавить к своему URL.

Например, если ваши запросы API позволяют использовать несколько методов запроса (GET/POST/и т.д.), вы хотите добавить эту строку запроса в свою базовую api url для запросов GET:

if (request.HTTPMethod == "GET") {
    urlPath += buildQueryString(fromDictionary:parm)
}

Если вы делаете только запросы GET, нет необходимости проверять, какой метод вы будете использовать для отправки ваших данных.

Ответ 2

@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 : @""];
}

Ответ 3

Бит с ума, что ни один из ответов здесь не предлагает использовать объекты NSURLComponents и NSURLQueryItem. Это самый безопасный и самый современный способ сделать это.

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

Ответ 4

Адаптировано для Swift 3

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

    for (k,value) in parameters {
        if let encodedValue = value.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) {
            urlVars.append(k + "=" + encodedValue)
        }
    }

    return urlVars.isEmpty ? "" : "?" + urlVars.joined(separator: "&")
}

Ответ 5

фиксированная объектная функция C

+(NSString *)buildQueryStringFromDictionary:(NSDictionary *)parameters
{
    NSString *urlVars = @"";
    for (NSString *key in parameters)
    {
        NSString *value = parameters[key];
        value = [value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
        urlVars = [NSString stringWithFormat:@"%@%@%@=%@", urlVars, urlVars.length ? @"&": @"", key, value];
    }
    return [NSString stringWithFormat:@"%@%@", urlVars ? @"?" : @"", urlVars ? urlVars : @""];
}

Ответ 6

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"url_to_your_web_service.php/?key=%@",value]];

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject];
NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:url
                                                completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                    if(error == nil){
                                                        NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
                                                        NSLog(@"Data = %@",text);
                                                        }
                                                    }
                                                }
                                   ];
[dataTask resume];

получить значение ключа внутри вашего php:

$ Значение = $ _ GET [ 'ключ'];