我正在尝试快速执行一个简单的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)

            }

    }

}


我主要是在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,因为这些多余的片段使它成为无效的JSON。我在这里想念什么?我正在使用带有最新Alamofire和EVReflection的Xcode 8 / Swift 3。我看过其他示例,但是它们大多数都已过时。许多示例还使用扩展名和自定义编码,对于这样一个简单的请求而言,这似乎很可笑。如果可以清理响应,请多加帮助和加分好。

最佳答案

要创建参数,您需要执行以下操作:

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


这意味着您将获得1个包含json作为字符串的参数。
EVReflection将首先将警报对象转换为字典,然后使用Apple标准函数将其转换为json:

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


由于使用的是.prettyPrinted选项,因此它将以易于阅读的格式进行格式化。这意味着它将在应有输入内容的地方添加/ n,并添加空格以进行漂亮的布局。

在您的情况下,您必须查看要调用的api,以查看应在代码中进行的更改。当前,您正在执行http get。然后,参数应该是简单的键-值对。如果要发布所有对象属性,则可以使用EVReflection toDictionary函数。但是在您的情况下,我认为您需要发表一篇文章(请参阅Alamofire文档),然后可以将json放入请求正文中。

附言我只是偶然发现了这个问题。也欢迎您在https://github.com/evermeer/EVReflection创建问题或在https://gitter.im/evermeer/EVReflection提问,然后我会收到通知。

关于ios - 带有Alamofire和EVReflection的JSON POST请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39949981/

10-14 20:33