【问题标题】:Post method request Alamofire发布方法请求 Alamofire
【发布时间】:2017-05-11 18:54:00
【问题描述】:

我正在使用 Swift 3 和 Alamofire 4.0。

我想创建与屏幕截图中显示的 Postman 请求类似的 Alamofire POST 请求:

我已经尝试过使用这些代码行:

var parameters:  [String: Any] = [
    "client_id" : "xxxxxx",
    "client_secret" : "xxxxx",
    "device_token" : "xxxx",
    "fullname" : "xxxxx",
    "gender": "xxx"
]

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

但是我收到了这个错误:

如何在 Swift 3 中使用 Alamofire 实现将 Body 作为表单数据的 POST 请求?

【问题讨论】:

  • 响应序列化有问题。是 JSON 格式的吗?
  • 查看错误是指 response 不是有效的 JSON,请尝试先查看响应。 (例如使用查尔斯)

标签: ios swift3 alamofire


【解决方案1】:
  • Swift 3.0 - Alamofire - 多部分表单数据上传的工作代码 *

// 参数

let params: [String : String] =
   ["UserId"    : "\(userID)",
    "FirstName" : firstNameTF.text!,
    "LastName"  : lastNameTF.text!,
    "Email"     : emailTF.text!
   ]

// 并上传

Alamofire.upload(
        multipartFormData: { multipartFormData in

            for (key, value) in params
            {
                    multipartFormData.append((value.data(using: .utf8))!, withName: key)
            }
    },
        to: url,
        encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    debugPrint(response)

                }
                upload.uploadProgress(queue: DispatchQueue(label: "uploadQueue"), closure: { (progress) in


                })

            case .failure(let encodingError):
                print(encodingError)
            }
    }
    )

如果您仍有问题,请告诉我。

【讨论】:

  • 我是 Swift 编程新手。 completionhandler() 是什么意思?我收到一个错误:Use of unresolved identifier 'completionhandler',但是在我删除它并从服务器收到 JSON 响应后,源代码运行良好。
  • 它有什么用?它只是您项目中的代码吗? :D
  • @user1808 - 我已经编辑了答案并删除了完成处理程序 是的 这是 swift 3 中使用最新的 Alamofire 将 multipartFormData 发布到服务器的示例。
【解决方案2】:

经过多次尝试,我成功了,所以试试这个

override func viewDidLoad() {
        super.viewDidLoad()


        let parameters: Parameters = ["client_id": "1","user_token":"xxxxxxxx"]
                // Do any additional setup after loading the view, typically from a nib.
        let url = "http://xxxxxxxxxxx/index.php/Web_api/get_client_profile"
        //let timeParameter =  self.getLastTimeStamp()
        self.request = Alamofire.request(url, method: .post, parameters:parameters)
        if let request = request as? DataRequest {
            request.responseString { response in
                //PKHUD.sharedHUD.hide()
                do{
                    let dictionary = try JSONSerialization.jsonObject(with: response.data!, options: JSONSerialization.ReadingOptions.allowFragments) as! NSDictionary
                    print(dictionary)

                }catch{

                }
            }
        }
    }

    var request: Alamofire.Request? {
        didSet {
            //oldValue?.cancel()
        }
    }

【讨论】:

    【解决方案3】:

    您可以使用 Alamofire 发布请求。

    let url = ""
    let headers    = [ "Content-Type" : "application/json"]
    let para : Parameters = [ "data" : JSONObject]
    Alamofire.request(url, method: .post, parameters: para, encoding: JSONEncoding.default, headers : headers)
        .responseJSON { response in
    
            print(response)
            print(response.result)
    
    }
    

    【讨论】:

      【解决方案4】:

      没什么好担心的。 如果您知道如何在 Swift 2.0/2.2 中执行此操作,Alamofire 请求方法没有太大变化(对于 Swift 3.0)。如果您了解旧方法,那么您也可以轻松理解这一方法。现在让我们仔细看看以下样板 -

      Alamofire.request(apiToHit, method: .post, parameters: parametersObject, encoding: JSONEncoding.default, headers: headerForApi).responseJSON { response in switch response.result{
      
          case .success(_):
              if let receivedData: Any = response.result.value{
                  if let statusCode: Int = response.response?.statusCode {
                     //Got the status code and data. Do your data pursing task from here.
                  }
              }else{
                   //Response data is not valid, So do some other calculations here
              }
          case .failure(_):
                  //Api request process failed. Check for errors here.
          }
      

      现在就我而言-

      1. apiToHit //你的api url字符串

      2. .post //请求的方法。您可以根据需要更改此方法,例如 .post、.get、.put、.delete 等。

      3. parametersObject // 此特定 api 所需的参数。如果您在邮递员等上发送“正文”,则相同。请记住,此参数应采用[String: Any] 的形式。如果你不需要这个,那么你可以通过nil

      4. JSONEncoding.default //这是编码过程。在我的情况下,我将其设置为.default,这是预期的。如果需要,您也可以将其更改为 .prettyPrinted

      5. headerForApi //这是您在请求 api 时要发送的标头。就我而言,它采用[String: String] 格式。如果你不需要这个,那么你可以通过nil

      6. .responseJSON //期望响应为 JSON 格式。您也可以根据需要更改此设置。

      现在,在我的请求中,我在请求闭包中使用 Switch 来检查结果,例如 response in switch response.result{

      case .success(_): 的情况下,我也在检查结果数据和http 状态代码,就像这样

      if let receivedData: Any = response.result.value{
          if let statusCode: Int = response.response?.statusCode {
       }
      }
      

      希望这会有所帮助。谢谢。

      【讨论】:

        【解决方案5】:
        class func alamofireMethod(methods: Alamofire.HTTPMethod , url : URLConvertible , parameters : [String : Any],need_flag_inside : Bool = false, paramJson : Bool = true ,need_loader : Bool = true,Header: [String: String],handler:@escaping CompletionHandler,errorhandler : @escaping ErrorHandler)
        {
            if NetworkController.sharedInstance.checkNetworkStatus()
            {
                var alamofireManager : Alamofire.SessionManager?
                var hed = Header
        
                if let tok = UserDefaults.standard.value(forKey: "TOKEN") as? String {
                    hed = ["Authorization":"Bearer \(tok)"]
                }
        
                if need_loader {
                   // DELEGATE.showLoader()
                }
                var UrlFinal = ""
                do
                {
                   try UrlFinal = baseURL + url.asURL().absoluteString
                }
                catch{}
        
        
                let configuration = URLSessionConfiguration.default
                configuration.timeoutIntervalForResource = 25
                configuration.timeoutIntervalForRequest = 25
                configuration.httpAdditionalHeaders  = hed
        
                alamofireManager = Alamofire.SessionManager(configuration: configuration)
        
                alamofireManager = Alamofire.SessionManager.default
            let json = JSON(parameters)
            guard let jsonDict = json.dictionaryObject else {
                return
            }
            var jsonData = Data()
            do {
        
                jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])
        
            } catch {
                //handle error
                print(error)
            }
        
            var request = URLRequest(url: URL(string: UrlFinal)!)
            request.httpMethod = methods.rawValue
        
            if methods == .post || methods == .put
            {
                //check  here
                if paramJson {
                    hed["Content-Type"] = "application/json"
                    request.httpBody = jsonData
                }else{
                    let postString = self.getPostString(params: parameters)
                    request.httpBody = postString.data(using: .utf8)
                }
        
            }
            request.allHTTPHeaderFields = hed
        
                Alamofire.request(request).responseJSON(queue: nil, options: JSONSerialization.ReadingOptions.allowFragments) { (response) in
                print(parameters)
                print(UrlFinal)
                print(hed)
              //  DELEGATE.hideLoader()
        
                if response.result.isSuccess
                {
                    print(response)
                    handler(response.result.value! as AnyObject)
                }
                else if response.response?.statusCode == 401
                {                
                //    DELEGATE.redirectToLogin()
                 //   DELEGATE.showToast(message: "Token Expired")
                }
                else{
                //    DELEGATE.showToast(message: default_failure)
                    errorhandler(response.result.error! as NSError)
                    print(response.result.error as Any)
                }
            }
            }else{
              //  DELEGATE.showToast(message: "Please check your internet connection.")
            }
        }
        

        Alomofire 在 swift 中使用 Post 和 Put 方法

        【讨论】:

          猜你喜欢
          • 2020-09-30
          • 2017-10-31
          • 1970-01-01
          • 1970-01-01
          • 2021-03-28
          • 2017-10-29
          • 1970-01-01
          • 2019-06-27
          • 1970-01-01
          相关资源
          最近更新 更多