V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
nyanyh
V2EX  ›  iDev

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

  •  
  •   nyanyh · 2016-05-23 11:53:20 +08:00 · 2602 次点击
    这是一个创建于 3105 天前的主题,其中的信息可能已经有所发展或是发生改变。
    手里有个小的办公 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 ,提交失败
    这是我设置的编码问题还是服务器的问题呢?
    9 条回复    2016-05-24 11:49:25 +08:00
    Balthild
        1
    Balthild  
       2016-05-23 14:19:24 +08:00 via Android
    双引号换成单引号有没有用?
    SeanChense
        2
    SeanChense  
       2016-05-23 14:24:55 +08:00
    那试着把 url 的转义功能关掉看看, manager 应该会有表征 requestConfigure 之类东西。
    nyanyh
        3
    nyanyh  
    OP
       2016-05-23 14:38:59 +08:00
    @Balthild Swift 没有单引号字符串啊……
    anerevol
        4
    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
        5
    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
        6
    garrydzeng  
       2016-05-23 16:07:13 +08:00
    服务端的锅? 说不定是手动解 JSON...
    Balthild
        7
    Balthild  
       2016-05-23 18:27:28 +08:00 via Android
    @nyanyh 呃………不是 json 吗?标准的 json 是支持单引号的……
    nyanyh
        8
    nyanyh  
    OP
       2016-05-24 08:48:03 +08:00
    @anerevol 有可能。看起来服务器是用 Laravel 搭的,几乎没有什么错误处理,任何超出预设功能之外的访问都会直接返回 500- -
    yongSir
        9
    yongSir  
       2016-05-24 11:49:25 +08:00
    服务器的锅 无误
    估计是把请求 JSON 当成字符串处理了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2798 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:54 · PVG 20:54 · LAX 04:54 · JFK 07:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.