2017-02-14 7 views
0

В коде нижебыстр 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)") 
        } 
       } 
      } 
     } 
    } 

идентификатора является строкой, переданной в функцию.

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

+1

JSON-объект верхнего уровня должен быть массив или словарь, а и нужно использовать JSONSerialization, чтобы получить данные в формате JSON от него. вы должны использовать URL вместо NSURL и URLRequest вместо NSURLReques. если вам нужен измененный запрос, объявите URLRequest как переменную. –

+0

Благодарим за быстрый ответ. Оказывается, что методы GET не добавляют параметры запроса к URL-адресу. Поэтому при создании запроса параметры должны быть частью URL. –

+0

Да, я не заметил, что вы использовали вместо него пост. Вы можете использовать URLComponents –

ответ

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() 
+0

Добавление параметров запроса к URL-адресу работает, но приведенный выше код не компилируется для меня. Ошибка dataTask вызвала ошибку. –

+0

Я успешно проверил этот код на Swift 3 Playground. Используйте собственные структуры Swift без 'NS' – vadian