【问题标题】:Alamofire post request:Alamofire 发布请求:
【发布时间】:2020-09-30 05:51:47
【问题描述】:

您好,我已经快速阅读了很多关于 alamofire 发布请求的问题和答案,但无法得到我真正想要的答案 我真正想要的是: 使用 URLRequest 和 URLSession 发布请求 我必须在 URLRequest 中分配一个 HTTPBody 这个主体可以是一个符合可编码或可编码的结构的实例,但是在 alamofire 发布请求中如何发送数据? 将要发送的数据放在哪里? 谢谢,不要将其标记为重复我已经阅读了很多帖子并没有找到答案。

【问题讨论】:

    标签: ios swift xcode alamofire urlsession


    【解决方案1】:
        let apiEndpoint: String = "https://xyz"
        let headers = ["Content-Type" : "application/json","Variable":"ABC"
        var param = [String: Any?]()
        param["Command"] = "ResetPin"
        var cellNo = MobileNumberField.text
        param["Data"] = jsonToString(json: ["CELLNO":"cellNo"])
        AF.request(URL(string: apiEndpoint)!, method: .post, parameters: param as Parameters, encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
    
            switch response.result {
            case .success(let value):
                if let json = value as? [String: Any] {
    
                    let data = JSON(json)
    
                    if data["Status"].stringValue == "0" {
                        let alert = UIAlertController(title: "Error", message: data["Message"].stringValue, preferredStyle: .alert)
                        alert.addAction(UIAlertAction(title: "Ok", style: .destructive) { _ in
                            return
                        })
                        self.present(alert, animated: true)
                    }
                    else {
                        let jsonStr = data["Data"]
    
                        let dict = convertToDictionary(text: jsonStr!)
    
                        if let dictMain = dict {
                            if (JSON(dictMain)["ISADMIN"].stringValue == "YES"){
                                //Is Admin
                                self.performSegue(withIdentifier:"AdminFoundSegue", sender: self)
                            } else {
                                //Is not Admin
                                self.performSegue(withIdentifier:"ConnectYourAccountSegue", sender: self)
                            }
                        }
                    }
                }
            case .failure(let error):
                print(error)
                let alert = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "Ok", style: .destructive) { _ in
                    return
                })
                self.present(alert, animated: true)
            }
        }
    

    【讨论】:

    • 谢谢,但请告诉我标题的用途
    • 在我提供的示例中,标头声明数据以 JSON 格式传递(“Content-Type”:“application/json”)。第二个变量是可选的。在我的例子中,我使用它将 JSON 传递给选定的 siteID ("Variable":"ABC")。
    【解决方案2】:

    使用 Alamofire 实现请求的方法有很多,这是一个简单的例子:

    首先,您是否必须从您的 API 和标头创建参数、URL:

    let parameters = [
        "username": "foo",
        "password": "123456"
    ]
    
    let url = "https://httpbin.org/post"
    
    static private var headers: HTTPHeaders {
            get {
                return [
                   "Authorization" : "Bearer \(Session.current.bearerToken ?? "")"
                ]
            }
        }
    

    所以你从 Alamofire 调用函数并传递你的数据:

    Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON {
                response in
                switch (response.result) {
                case .success:
                    print(response)
                    break
                case .failure:
                    print(Error.self)
                }
            }
    }
    

    :)

    【讨论】:

    • 非常感谢,但请告诉我 httpHeaders 的用途
    • 在某些 API 中,您必须发送标头以确保安全以及附加数据。这只是标题的一个示例。它们被广泛用于身份验证。但在你的情况下,你可以发送 [:] 一个空字典。
    【解决方案3】:

    Alamofire 有非常好的文档here。这说明了所有关于传递可编码参数的信息。这是一个例子:

    AF.request("myRequestUrl", method: .post, parameters: encodableModel).responseString { print($0) }
    

    【讨论】:

      【解决方案4】:
      // Create url request
      // Get your instance of codable struct model
      
      do {
          let encoder = JSONEncoder()
          let data = try encoder.encode(yourCodableObject)
          your_urlRequest.httpBody = data
      } catch {
      
      }
      

      【讨论】:

      • 非常感谢,但打算使用 alamofire 发送数据
      • 好的,但您的问题是如何将 Codable 结构中的数据放入 URLRequest 的 HTTPBody 中。所以回答了。
      • 非常感谢,但实际上我的问题很热门,无法使用 alamofire 发出帖子请求
      猜你喜欢
      • 2017-05-11
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2017-10-29
      • 1970-01-01
      • 2021-10-11
      • 2018-12-11
      相关资源
      最近更新 更多