【问题标题】:Sending json object in GET request in swift in Alamofire在 Alamofire 中快速发送 GET 请求中的 json 对象
【发布时间】:2016-12-25 09:13:07
【问题描述】:

我正在尝试使用绑定到它的 json 对象执行 GET 请求,这就是我生成 JSON 对象的方式

   let jsonObject: [String: AnyObject] = [

        "ean_code": [
            "type": "match",
            "value": "16743799"
        ]
    ]

然后我执行了请求

喜欢这个

        Alamofire.request(.GET,Constant.WebClient.WS_URL + "/product?filters="+String(jsonObject),parameters:parameters)

但这给了我一个错误,即无法使用无效字符绑定 URL

所以我从这个编码了 URL

let request = String(jsonObject).stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPasswordAllowedCharacterSet())!

这将对 URL 进行编码,但我再次这将给我以下错误

请求失败并出现错误:Error Domain=NSCocoaErrorDomain Code=3840 “字符 0 周围的值无效。” UserInfo={NSDebugDescription=字符 0 附近的值无效。}

所以我的问题是如何将 json 对象绑定到 GET URL?

【问题讨论】:

  • json总是在变化吗?

标签: ios swift alamofire


【解决方案1】:

您似乎正在尝试通过两种方式添加查询参数:

  • 在 URL 字符串的末尾添加一个参数
  • 通过向 Alamofire 请求传递参数

当您执行GET 请求时,您的参数无论如何都应该是 URL 编码的,因为 GET 请求不应该有正文。为什么不直接将filters 查询添加到参数中?

let parameters: [String: AnyObject] = [

    "ean_code": [
        "type": "match",
        "value": "16743799"
    ]
]

Alamofire.request(.GET, Constant.WebClient.WS_URL + "/product", parameters: parameters)

【讨论】:

  • 我已编辑问题请立即检查,商户名称参数不正确
  • 我已经更新了我的答案。您不需要“手动”将参数附加到您的网址。 parameters 参数旨在对参数进行编码并为您执行此操作。
  • 您能否提供一个查询字符串应该是什么样子的示例?服务器期待什么?一旦我们看到我们应该能够帮助您构建它
  • %7B%22ean_code%22%3A%7B%22type%22%3A%22match%22%2C%22value%22%3A%2216743799%22%7D%7D 这个应该是json格式应该出现在过滤器参数中我用大摇大摆测试了这个
【解决方案2】:

做这样的事情

let parameters: [String: AnyObject] = [

    "filters": "merchantName",
    "ean_code": [
        "type": "match",
        "value": "16743799"
    ]
]

do {
    let data = try NSJSONSerialization.dataWithJSONObject(parameters, options: .PrettyPrinted)
    let jsonString = NSString(data: data, encoding: NSUTF8StringEncoding)
    let urlEncodedJson = jsonString!.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
    let urlString = "http://www.filter.com/&params=\(urlEncodedJson!)"
    let url = NSURL(string: urlString)
    // Trigger alaomofire request with url
}
catch let JSONError as NSError {
    print("\(JSONError)")
}

【讨论】:

  • 我还是想说,不要在 url 中发送 json 对象,而是使用 post/put 请求来做到这一点。
  • 我完全同意你的看法。但是后端是从 larevel 开发的,似乎可以在 GET 中发送参数,
【解决方案3】:

试试:

func encode(json: [String: AnyObject]) -> NSMutableURLRequest {
    let request: NSMutableURLRequest = ...
    if let URLComponents = NSURLComponents(URL: request.URL!, resolvingAgainstBaseURL: false) {
    let percentEncodedQuery = (URLComponents.percentEncodedQuery.map { $0 + "&" } ?? "") + query(json)
    URLComponents.percentEncodedQuery = percentEncodedQuery
    request.URL = URLComponents.URL
    return request
}

func query(parameters: [String: AnyObject]?) -> String {
    guard let parameters = parameters else {
        return ""
    }
    var components: [(String, String)] = []

    for key in parameters.keys.sort(<) {
        let value = parameters[key]!
        components += queryComponents(key, value)
    }

    return (components.map { "\($0)=\($1)" } as [String]).joinWithSeparator("&")
}

func queryComponents(key: String, _ value: AnyObject) -> [(String, String)] {
    var components: [(String, String)] = []

    if let dictionary = value as? [String: AnyObject] {
        for (nestedKey, value) in dictionary {
            components += queryComponents("\(key)[\(nestedKey)]", value)
        }
    } else if let array = value as? [AnyObject] {
        for value in array {
            components += queryComponents("\(key)[]", value)
        }
    } else {
        components.append((key, "\(value)"))
    }

    return components
}

将其用作:

Alamofire.request(encode(json))

这只是代码片段,所以你必须把它放在适当的地方:)

【讨论】:

  • 我的意思是你必须创建带有后端服务路径的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
相关资源
最近更新 更多