【问题标题】:Alamofire post request with body带有正文的 Alamofire 发布请求
【发布时间】:2018-12-11 19:07:19
【问题描述】:

我正在尝试使用 Alamofire 发送带有正文的 POST HTTP 请求,希望能提供任何帮助。

我的身体:

{"data":{"gym":{"country":"USA","city":"San Diego","id":1}}}

我应该这样做吗?

let parameters: [String: Any] = [ "data": [
  "gym": [
  "country":"USA",
  "city":"San Diego",
  "id":1
]]]

Alamofire.request(URL, method: .post, parameters: parameters, headers: headers())
  .responseJSON { response in
    print(response)
} 

【问题讨论】:

  • 你遇到什么问题
  • 我认为你需要在请求正文中传递json作为参数,尝试在json数据中转换parameters n pass in request body
  • 所以服务器说它无效,但是当我在邮递员中这样做时,它可以正常工作

标签: ios swift alamofire


【解决方案1】:

如果您希望以 json 格式发送参数,请使用编码作为 JSONEncoding。所以在请求中添加编码参数如下:

Alamofire.request(URL, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers())
   .responseJSON { response in
    print(response)
} 

希望对你有帮助...

【讨论】:

    【解决方案2】:

    试试这个方法把你的json字符串转换成字典

    func convertToDictionary(text: String) -> [String: Any]? {
        if let data = text.data(using: .utf8) {
            do {
                return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
            } catch {
                print(error.localizedDescription)
            }
        }
        return nil
    }
    
    let str = "{\"data\":{\"gym\":{\"country\":\"USA\",\"city\":\"San Diego\",\"id\":1}}}"
    
    let dict = convertToDictionary(text: str)
    

    并在您的请求中将字典作为参数发送。

    Alamofire.request(URL, method: .post, parameters: dict, headers: headers())
      .responseJSON { response in
        print(response)
    } 
    

    参考:How to convert a JSON string to a dictionary?

    【讨论】:

    • 太好了,非常感谢,如果我添加编码就可以了:JSONEncoding.default
    【解决方案3】:

    我认为你应该尝试以这种格式准备你的字典:

    var gym = [String:Any]()
    gym["country"] = "USA"
    gym["city"] = "San"
    
    var data = [[String:Any]]()
    data.append(gym)
    var metaData = [String:Any]()
    metaData["data"] = data
    

    【讨论】:

      【解决方案4】:

      您的parameters 错误...

      let parameters: [String: Any] = { "data": 
        {
          "gym": {
            "country":"USA",
            "city":"San Diego",
            "id":1
          }
        }
      }
      
      Alamofire.request(<YOUR-URL>,
                            method: .post,
                            parameters: parameters,
                            encoding: URLEncoding(destination: .queryString),
                            headers: <YOUR-HEADER>
            ).validate().responseString { response in
            switch response.result {
            case .success:
      
              debugPrint("Good to go.")
              debugPrint(response)
      
            case .failure:
      
              let errMsg = String(data: response.data!, encoding: String.Encoding.utf8)!
              debugPrint(errMsg)
              debugPrint(response)
      
            }
          }
      

      希望对您有所帮助。顺便说一句,在 Alamofire 5 中,debugPrint(response) 可以打印出response.data directly

      【讨论】:

        猜你喜欢
        • 2015-10-08
        • 2019-06-06
        • 2020-09-30
        • 2020-12-23
        • 1970-01-01
        • 1970-01-01
        • 2021-11-17
        • 1970-01-01
        • 2017-08-31
        相关资源
        最近更新 更多