swift URLRequest не отправляет параметры

В коде ниже

    let bodyData = "?sub=\(id)&name=User&[email protected]"
    let url = NSURL(string: "https://httpbin.org/get");
    let request:NSMutableURLRequest = NSMutableURLRequest(url:url as! URL)
    request.httpMethod = "GET"
    request.httpBody = bodyData.data(using: String.Encoding.utf8);
    NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: OperationQueue.main)
    {
        (response, data, error) in
        if let HTTPResponse = response as? HTTPURLResponse {
            let statusCode = HTTPResponse.statusCode

            if statusCode == 200 {
                // Yes, Do something. 
                let json = try? JSONSerialization.jsonObject(with: data!, options: [])
                if let dictionary = json as? [String: Any] {
                    let args = dictionary["args"]
                    NSLog("args:\(args)")
                    for (key, value) in dictionary{
                        NSLog("key:\(key) value:\(value)")
                    }
                }
            }
        }
    }

id — это строка, переданная функции.

Он возвращает действительные данные, но тестовый сайт / URL-адрес также возвращает в формате json любые параметры, которые вы ему отправляете. Но этот фрагмент кода, похоже, не отправляет параметры запроса, определенные в bodyData, и я не могу понять, почему.


person Mike Weber    schedule 14.02.2017    source источник
comment
Объект верхнего уровня JSON должен быть массивом или словарем, и вам нужно использовать JSONSerialization, чтобы получить из него данные JSON. вы должны использовать URL вместо NSURL и URLRequest вместо NSURLRReques. если вам нужен изменяемый запрос, объявите URLRequest как переменную.   -  person Leo Dabus    schedule 14.02.2017
comment
Спасибо за быстрый ответ. Оказывается, методы GET не добавляют параметры запроса к URL-адресу. Поэтому параметры должны быть частью URL-адреса при создании запроса.   -  person Mike Weber    schedule 14.02.2017
comment
Да, я не заметил, что вы использовали get вместо post. Вы можете использовать URLComponents   -  person Leo Dabus    schedule 14.02.2017


Ответы (1)


Если используется запрос GET, параметры добавляются к URL-адресу, и явное URLRequest вообще не требуется.

Этот код является родным для Swift 3 и использует современный API:

let id = 12

let bodyData = "?sub=\(id)&name=User&[email protected]"
let url = URL(string: "https://httpbin.org/get" + bodyData)!

URLSession.shared.dataTask(with: url) { (data, response, error) in

    if error != nil  {
        print(error!)
        return
    }

    do {
       if let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:Any],
          let args = json["args"] as? [String:Any] {
            print("args:\(args)")
            for (key, value) in args{
                print("key:\(key) value:\(value)")
            }
        }
    } catch {
        print(error)
    }
}.resume()
person vadian    schedule 14.02.2017
comment
Добавление параметров запроса к URL-адресу работает, но приведенный выше код не скомпилировался для меня. dataTask вызвал ошибку. - person Mike Weber; 16.02.2017
comment
Я успешно протестировал именно этот код на игровой площадке Swift 3. Используйте собственные структуры Swift без NS - person vadian; 16.02.2017