【问题标题】:how to retrieve NSURLRequest's HTTPBody params to Dictionary: [NSObject: AnyObject] in Swift如何在 Swift 中检索 NSURLRequest 的 HTTPBody 参数到 Dictionary: [NSObject: AnyObject]
【发布时间】:2015-05-27 13:40:32
【问题描述】:

我正在尝试将NSURLRequestHTTPBodyNSData 转换为Dictionary,以便访问它的参数并运行检查。

 var parameters: [NSObject: AnyObject?] = [
            "method": "foo",
        ]
        var urlRequestString = "www.foobar.com/api/aMethod"
        var urlRequest = AFOAuth2Manager().requestSerializer.requestWithMethod("POST",
            URLString:urlRequestString ,
            parameters: postParameters,
            error: nil)

在另一种方法中,我试图对上面构造的urlRequest 进行检查,以确保 NSURLRequest 中的"method" 包含正确的值"foo"

我需要将HTTPBody 转换为Dictionary ([NSObject: AnyObject]) 这样我就可以检查"method" 参数是否包含我需要的值。

我怎样才能做到这一点?

【问题讨论】:

    标签: ios swift dictionary afnetworking nsurlconnection


    【解决方案1】:

    试试这个:

    func queryDictionaryForQueryString(query: String) -> Dictionary<String, String> {
        var dictionary = [String: String]()
    
        for keyValueString in query.componentsSeparatedByString("&") {
            var parts = keyValueString.componentsSeparatedByString("=")
            if parts.count < 2 { continue; }
    
            var key = parts[0].stringByRemovingPercentEncoding!
            var value = parts[1].stringByRemovingPercentEncoding!
    
            dictionary[key] = value
        }
    
        return dictionary
    }
    

    那么你可以

    let httpBody = urlRequest.HTTPBody
    let httpBodyString = NSString(data: httpBody!, encoding: NSUTF8StringEncoding) as! String
    let queryDictionary = queryDictionaryForQueryString(httpBodyString)
    println(queryDictionary["method"])
    

    【讨论】:

    • "let httpBodyString = NSString(data: httpBody!, encoding: NSUTF8StringEncoding) as!String" 为我返回 nil。 httpBody 在我的地方是 NSMutableData 并且转换为 String 似乎不起作用。
    【解决方案2】:

    这是我的更 Swifty 3.0 NSURL 扩展,以实现零安全性:

    extension NSURL {
    
        var paramsDictionary: [String : String]? {
    
            guard let parameterString = parameterString else {
                return nil
            }
    
            var dictionary: [String : String] = [:]
            parameterString.components(separatedBy: "&").forEach {
                let componants = $0.components(separatedBy: "=")
                guard let name = componants[0].removingPercentEncoding, let value = componants[1].removingPercentEncoding else {
                    return
                }
                dictionary[name] = value
            }
            return dictionary.isEmpty ? nil : dictionary
        }
    }
    
    var url = NSURL(string: "https://www.testWebSite.com/index.php;param=value&testParam=test&thingParam=thing")
    let params = url?.paramsDictionary //results in "Optional(["thingParam": "thing", "testParam": "test", "param": "value"])"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多