Alamofire JSON 参数编码因 elasticsearch 失败

Posted

技术标签:

【中文标题】Alamofire JSON 参数编码因 elasticsearch 失败【英文标题】:Alamofire JSON parameter encoding fail with elasticsearch 【发布时间】:2018-09-30 08:58:07 【问题描述】:

我正在尝试使用 alamofire 和 swift 4 向弹性搜索发出请求。我尝试了每种类型的 json 参数编码,但请求仍然超时。如果我输入 nil 参数,响应会很好,但我想构建一些查询参数。

我尝试像这样构建我的参数:

    let jsonString = " \"query\":  \"multi_match\":  \"query\": \"param1 param2 alabala etc\", \"fields\": [\"title\", \"description\", \"category\"], \"fuzziness\": 5   "
        let data = jsonString.data(using: .utf8)
        do 
            let params = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]
            print("ParamsJSON: \(params)")
         catch 
            print(error)
        

还有这样的:

   let params1 = [
        "query": [
            "multiMatch": [
                "query" : "param1 param2 alabala etc",
                "fields" : ["title*2, description*1.5"],
                "fuzziness" : 5
            ]
        ]
    ]

我的 alamofire 请求也在这里:

    let headers = [
        "Content-Type": "application/json"
    ]
    let url = "someurl"

    let request = Alamofire.request(url, method: .get, parameters: params1, encoding: JSONEncoding.default, headers: headers)
    .authenticate(user: "user", password: "pass")
    .responseJSON  response in
        if let data = response.data
            do
                let json = try JSON(data: data)
                completion(json)
             catch 

            

        
    

    debugPrint(request)

url 和身份验证有效,因为查询无需向其发送参数即可工作。只有当我发送参数时,alamofire 才会返回 Request timed out 错误。

谁能帮我解决这个问题?

【问题讨论】:

您是否尝试将 Alamofire 请求函数 JSONEncoding.default 中的编码替换为 URLEncoding.default 是的,但它不起作用。从我所看到的 url 编码将 curl 请求的 -d 参数作为 url 的主体发送,而我需要将其作为 JSON 发送 【参考方案1】:

对于所有正在寻找答案的人。发生这种情况的原因是因为 GET 请求通常没有正文(它适用于 cURL,以及一些用于测试目的的服务器)。

所以答案是,您需要将请求从 .get 更改为 .post。

【讨论】:

以上是关于Alamofire JSON 参数编码因 elasticsearch 失败的主要内容,如果未能解决你的问题,请参考以下文章

尽管采用 json 编码,但不存在必需的参数

使用参数编码 JSONEncoding.default 时请求超时

Alamofire 自定义参数编码

Alamofire JSON 编码布尔问题?

如何使用 Alamofire Swift 4 在 JSON 编码中传递数据

如何阻止 Alamofire 编码 URL 参数