我试图在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)
}
}
}
我主要是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。我在这里错过了什么?我正在使用Xcode 8 / Swift 3,以及最新的Alamofire和EVReflection。我已经查看了其他示例,但它们大多已经过时了。其中很多也使用扩展和自定义编码,这对于这样一个简单的请求来说似乎很荒谬。如果您可以清理响应,请欣赏任何帮助和奖励积分好吧。
答案 0 :(得分:0)
创建参数:
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放在请求体中。
P.S。我偶然发现了这个问题。我们也欢迎您https://github.com/evermeer/EVReflection创建问题或在https://gitter.im/evermeer/EVReflection提问。然后我会收到通知。