发布方法请求Alamofire

时间:2016-12-27 13:19:21

标签: ios swift3 alamofire

我正在使用Swift 3和Alamofire 4.0。

我想创建类似的Alamofire POST请求,如截图所示的Postman请求:

enter image description here

我尝试过这些代码:

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)
}

但我收到了这个错误:

enter image description here

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

5 个答案:

答案 0 :(得分:0)

经过太多尝试,我已经成功了,试试这个

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()
        }
    }

答案 1 :(得分:0)

  • 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)
            }
    }
    )

如果您仍然遇到问题,请告诉我。

答案 2 :(得分:0)

您可以使用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)

}

答案 3 :(得分:0)

无需担心。 如果你知道如何在Swift 2.0 / 2.2中做到这一点,Alamofire请求方法没有那么多改变(For 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格式的响应。您也可以根据需要进行更改。

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

    case .success(_):内部我还在检查结果数据和http状态代码,以及

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

    希望这有帮助。感谢。

答案 4 :(得分:0)

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