2016-10-10 2 views
0

신속한 간단한 POST 요청을하려고합니다. 객체 (알람) 배열을 게시하고 문제가 계속 발생하기를 바랍니다. 여기에 지금까지 무엇을 가지고 :Alamofire 및 EVReflection을 사용하는 JSON POST

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) 

      } 

    } 

} 

I "m 주로 어떤 이유를 들어, Alamofire이 객체의 배열을하는 것 같지 수 parameters 부분에 문제가, 그래서 상단이 사전을 만들었습니다. . 경보의 배열을 보유 수준 alarm 키는 그때 JSON 문자열로 내 알람 배열을 변환 EVReflection를 사용하지만 그 변환은 나에게주는이 :.

있습니다
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,이 여분 조각이 inval를 만들기 때문에 서버는 400로 응답합니다. id JSON. 내가 여기서 무엇을 놓치고 있니? 최신 Alamofire 및 EVReflection과 함께 Xcode 8/Swift 3을 사용하고 있습니다. 다른 예제를 살펴 보았지만 대부분 오래된 버전입니다. 또한 많은 사람들이 확장 기능과 사용자 지정 인코딩을 사용하기 때문에 간단한 요청에 대해서는 우스꽝 스럽습니다. 응답을 정리할 수 있으면 모든 도움과 보너스 포인트를 생각해보십시오. . 잘

답변

0

매개 변수를 만들기 위해 당신은 일을 :. 당신은 문자열로 JSON을 포함 1 paramater를 얻을 것이다 첫번째 알람을 변환합니다 EVReflection이 사전에 반대하는 의미

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

Apple 표준 함수를 사용하여 json으로 변환하십시오.

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

.prettyPrinted 옵션을 사용하기 때문에 읽기 쉬운 형식으로 서식이 지정됩니다. 즉, 좋은 레이아웃을 만들기 위해 입력해야하는 위치에/n을 더합니다.

귀하의 경우 코드에서 변경해야하는 것을보기 위해 호출중인 API를 살펴 봐야합니다. 현재 http get을하고 있습니다. 그런 다음 매개 변수는 간단한 키 - 값 쌍이어야합니다. 모든 개체 속성을 게시하려면 EVReflection toDictionary 함수를 사용할 수 있습니다. 그러나 귀하의 경우에는 게시물 (Alamofire 설명서 참조)을 수행해야한다고 생각하고 json을 요청 본문에 넣을 수 있습니다.

P. 방금 실수로이 문제를 발견했습니다. 당신은 또한 https://github.com/evermeer/EVReflection에서 이슈를 만들거나 https://gitter.im/evermeer/EVReflection에서 질문을 할 수 있습니다. 그런 다음 알림을 받게됩니다.

+0

예, 나는 하나의 항목과 하나의 json 문자열로 사전을 만드는 것에 동의합니다. 실제로 원하는 것은 알람 개체 배열을 포함하는 완전한 사전입니다. Alamofire는이를 json으로 적절하게 인코딩 할 것입니다. toDictionary는 나에게 정말 이상한 결과를주었습니다. 그러나 나는 그것에 많은 시간을 할애하지 않았습니다 .BTW, 나는 이미 POST 요청을하고 있습니다. 링크를 확인해 보겠습니다. – 7200rpm

+0

을 입력 한 다음 사전을 해당 사전에 추가하지 않았는지 확인하십시오. .toDictionary()를 매개 변수에 넣으십시오. –

관련 문제