2016-10-10 4 views
0

Я пытаюсь выполнить простой запрос POST в swift. Я хотел бы разместить массив объектов (аварийных сигналов), и я постоянно сталкиваюсь с проблемами. Вот то, что я до сих пор:Запрос JSON POST с Alamofire и EVReflection

func submitAlarms(alarms: [Alarm],onCompletion: @escaping ([Alarm]) -> Void){ 

    let route = baseURL 

    let token = SessionManager().storedSession!.token.idToken 

    let headers = [ 
     "Authorization": "Bearer \(token)" 
    ] 


    let parameters = [ 
     "alarms": alarms.toJsonString()] 

    print("Parameters ", parameters) 


    Alamofire.request(route, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers) 
     .validate() 
     .responseJSON{ response in 

      switch response.result{ 
      case .failure(let error): 
       print("POST Alarm JSON Error: \(error)") 
      case .success(let value): 
       let json = JSON(value) 

       let alarms_json = json["alarms"] 

       print(alarms_json) 

       let alarms_string = alarms_json.rawString() 

       let alarms: [Alarm] = [Alarm](json: alarms_string) 

       //let alarms = [Alarm](json: res_string) 

       onCompletion(alarms) 

      } 

    } 

} 

я "м в основном возникают проблемы с parameters части по какой причине, Alamofire не может взять массив объектов, поэтому я создал словарь с вершиной. . уровень alarm ключа, который содержит массив тревог затем я использую EVReflection конвертировать мой массив тревоги в строку JSON Но это преобразование дает мне это:.

Parameters ["alarms": "[\n{\n \"isActive\" : true,\n \"volume\" : 10,\n \"minute\" : 15,\n \"days\" : [\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6\n ],\n \"brightness\" : 10,\n \"hour\" : 6,\n \"audio\" : 4,\n \"duration\" : 1,\n \"label\" : \"Alarm\",\n \"allowSnooze\" : false,\n \"isSynchronized\" : false\n}\n]"] 

Где все это дополнительные \ и \n приходят с помощью? Alamofire, сервер отвечает 400, потому что эти дополнительные части делают его недействительным id JSON. Что мне здесь не хватает? Я использую Xcode 8/Swift 3 с последними версиями Alamofire и EVReflection. Я рассмотрел другие примеры, но они в основном устарели. Многие из них также используют расширения и настраиваемую кодировку, что кажется смешным для такого простого запроса. Оцените любую помощь и бонусные баллы, если вы можете очистить ответ как . хорошо

ответ

0

для создания параметров вы делаете:

let parameters = ["alarms": alarms.toJsonString()] 

Это означает, что вы получите 1 в параметре, который будет содержать JSON в виде строки EVReflection будет первым преобразовать сигналы объекта в словарь. а затем преобразовать его в json, используя стандартную функцию Apple:

JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) 

Поскольку он использует опцию .prettyPrinted, он будет отформатирован в удобном для чтения формате. Это означает, что он добавит/n для того, где должны быть добавлены пробелы для создания хорошего макета.

В вашем случае вы должны посмотреть на api, который вы вызываете, чтобы увидеть, что вы должны изменить в своем коде. В настоящее время вы делаете http get. Тогда параметры должны быть простыми парами ключ-значение. Вы можете использовать функцию EVReflection toDictionary для этого, если вы хотите опубликовать все свои свойства объекта. Но в вашем случае я думаю, вам нужно сделать сообщение (см. Документацию Alamofire), а затем вы можете поместить json в тело запроса.

P.S. Я просто нашел эту проблему случайно. Вы также можете создавать проблемы по адресу https://github.com/evermeer/EVReflection или задавать вопросы по адресу https://gitter.im/evermeer/EVReflection. Тогда я получу уведомление.

+0

Да, я согласен с тем, что моя проблема заключается в том, что я создаю словарь с одним элементом и одной строкой json, тогда как я действительно хочу, это полный словарь, содержащий массив объектов тревоги. Оттуда я считаю, что Alamofire правильно закодирует это в json. В toDictionary мне дали некоторые действительно странные результаты, но я не потратил на это много времени. Кстати, я уже делаю запрос POST, см. Выше. Я проверю ссылку, спасибо – 7200rpm

+0

, затем убедитесь, что вы не добавляете словарь в этот словарь. Просто сделайте .toDictionary() и поместите это в параметры. –

Смежные вопросы