ios - 使用 Alamofire 和 EVReflection 的 JSON POST 请求

标签 ios json swift

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

            }

    }

}

我主要遇到参数部分的问题。无论出于何种原因,Alamofire似乎无法获取对象数组,因此我创建了一个带有顶级警报的字典保存警报数组的 键。然后我使用 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。我在这里缺少什么?我正在使用 Xcode 8/Swift 3,以及最新的 Alamofire 和 EVReflection。我看过其他示例,但它们大多已经过时了。其中很多还使用扩展和自定义编码,这对于这样一个简单的请求来说似乎很荒谬。如果您可以将响应清理为好吧。

最佳答案

为了创建您正在执行的参数:

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

这意味着您将获得 1 个参数,其中包含 json 作为字符串。 EVReflection首先会将alarms对象转换为字典,然后使用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/

相关文章:

ios - 在 iOS 上使用带有 ARC 的 block 时,确保对象存在并且不会泄漏的正确方法是什么?

ios - 将变量分配给传入 View Controller 的正确方法

objective-c - 项目针对模拟器进行编译,但针对设备进行编译时出现 40 个错误

javascript - 在 Javascript 中对嵌套数组进行分组

android - 使用包含参数的 json 对象改造 POST

ios - 触摸在Xcode模拟器中无法工作(苹果官方教程 'FoodTracker')

ios - 使用AVAudioRecorder在后台录制语音

json - 用 Ant 解析json

swift - UIButton 子类能否覆盖已在 Storyboard中为按钮设置的 x、y、宽度和高度属性?

ios - 从 Rails 到 Swift 格式化时间 - iOS