使用 Alamofire POST 提交 json 遇到的问题

2016-05-23 11:53:20 +08:00
 nyanyh
手里有个小的办公 OA App , Android 版就是网页套一个 WebView ,我接手了 iOS 版的开发。 App 里有一个上传地理位置考勤的功能(使用高德 SDK ),但是在上传数据的时候,从网页提交的 json 在 Charles 里看起来是这样:

{
"src": "http://restapi.amap.com/v3/staticmap?location=L,L&zoom=15&size=750*300&markers=mid,,A:L,A&key=my_key",
"_method": "POST"
}

而我使用 Alamofire 这样提交数据:
self.manager.request(.POST, self.checkinURL, parameters: ["_method": "POST", "src": url], encoding: .JSON).validate().response()

之后发现 url 中的"/"被编码了,变成:
{
"src": "http:\/\/restapi.amap.com\/v3\/staticmap?location=L,L&zoom=15&size=750*300&markers=mid,,A:L,A&key=my_key",
"_method": "POST"
}

结果导致服务器后台一直返回 500 ,提交失败
这是我设置的编码问题还是服务器的问题呢?
2602 次点击
所在节点    iDev
9 条回复
Balthild
2016-05-23 14:19:24 +08:00
双引号换成单引号有没有用?
SeanChense
2016-05-23 14:24:55 +08:00
那试着把 url 的转义功能关掉看看, manager 应该会有表征 requestConfigure 之类东西。
nyanyh
2016-05-23 14:38:59 +08:00
@Balthild Swift 没有单引号字符串啊……
anerevol
2016-05-23 14:54:39 +08:00
看了下 Alamofire 源代码, JSON 参数序列化如下:
case .JSON:
do {
let options = NSJSONWritingOptions()
let data = try NSJSONSerialization.dataWithJSONObject(parameters, options: options)

if mutableURLRequest.valueForHTTPHeaderField("Content-Type") == nil {
mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
}

mutableURLRequest.HTTPBody = data
} catch {
encodingError = error as NSError
}

是 NSJSONSerialization.dataWithJSONObject 的问题吧,貌似没有很优雅的解决方案
http://stackoverflow.com/questions/19651009/how-to-prevent-nsjsonserialization-from-adding-extra-escapes-in-url
anerevol
2016-05-23 15:38:23 +08:00
另外看了下 JSON 定义 http://www.json.org/, 里面有说到转义问题, http://www.json.org/string.gif
然后用 nodejs 简单写了个 post json 的服务器,用 Alamofire post json ,然后服务器解析是正常的。
不知道你们服务器是用的什么,是不是把请求 JSON 当成字符串处理了?
garrydzeng
2016-05-23 16:07:13 +08:00
服务端的锅? 说不定是手动解 JSON...
Balthild
2016-05-23 18:27:28 +08:00
@nyanyh 呃………不是 json 吗?标准的 json 是支持单引号的……
nyanyh
2016-05-24 08:48:03 +08:00
@anerevol 有可能。看起来服务器是用 Laravel 搭的,几乎没有什么错误处理,任何超出预设功能之外的访问都会直接返回 500- -
yongSir
2016-05-24 11:49:25 +08:00
服务器的锅 无误
估计是把请求 JSON 当成字符串处理了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/280595

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX