Alamofire Swift 3.0电话中的额外参数

时间:2016-09-14 12:46:53

标签: alamofire swift3

我已将我的项目迁移到Swift 3(并在Podfile中将Alamofire更新为最新的带有pod 'Alamofire', '~> 4.0'的Swift 3版本。)

我现在在电话中得到一个"额外的参数"每个Alamofire.request上的错误。例如:

let patientIdUrl = baseUrl + nextPatientIdUrl
Alamofire.request(.POST, patientIdUrl, parameters: nil, headers: nil, encoding: .JSON)

有人可以告诉我为什么吗?

14 个答案:

答案 0 :(得分:78)

根据版本4.0.0的Alamofire文档,使用 HTTP 方法的网址请求如下:

Alamofire.request("https://httpbin.org/get") // method defaults to `.get`    
Alamofire.request("https://httpbin.org/post", method: .post)
Alamofire.request("https://httpbin.org/put", method: .put)
Alamofire.request("https://httpbin.org/delete", method: .delete)

所以您的网址请求将是:

Alamofire.request(patientIdUrl, method: .post, parameters: nil, encoding: JSONEncoding.default, headers: nil)

并且示例请求将是:

Alamofire.request(url, method: .post, parameters: param, encoding: JSONEncoding.default, headers: [AUTH_TOKEN_KEY : AUTH_TOKEN])
    .responseJSON { response in
        print(response.request as Any)  // original URL request
        print(response.response as Any) // URL response
        print(response.result.value as Any)   // result of response serialization
}

希望这有帮助!

答案 1 :(得分:68)

这个对我有用。
无需删除编码参数

Swift 5.x更新

Alamofire使用 Swift 5 中引入的Result类型。
另外Alamofire.request已更改为AF.request,现在会读取他们的开关{ {1}}值为response.result.success

.failure

Swift 3.x / 4.x

AF.request("https://yourServiceURL.com", method: .get, parameters: [:], encoding: URLEncoding.default, headers: ["":""]).responseJSON { (response:DataResponse<Any>) in
        switch response.result {
        case let .success(value):
            print(value)
        case let .failure(error):
            print(error)
    }
}

并确保参数的类型为

Alamofire.request("https://yourServiceURL.com", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            if let data = response.result.value{
                print(response.result.value)
            }
            break

        case .failure(_):
            print(response.result.error)
            break

        }
    }

如果获取

[String:Any]?

甚至可以使用

Alamofire.request("https://yourGetURL.com", method: .get, parameters: ["":""], encoding: URLEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            if let data = response.result.value{
                print(response.result.value)
            }
            break

        case .failure(_):
            print(response.result.error)
            break

        }
    }

标题

如果您要传递标题,请确保其类型应为JSONEncoding.default

浏览[String:String] https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md#parameter-encoding-protocol

答案 2 :(得分:5)

  

使用Swift 3.0和xCode 8.0发布方法Alamofire 4.0

Alamofire.request(URL, method: .post, parameters: PARAMS)
                            .responseJSON { closureResponse in
                        if String(describing: closureResponse.result) == "SUCCESS"
                        { 
                           // Sucess code  
                        }
                        else
                        { 
                           // Failure Code 
                        }
                 }

答案 3 :(得分:4)

我的解决方案是,如果您使用标头,其类型必须是[String:String]。

答案 4 :(得分:2)

此错误取决于参数值。它必须是[String:String]

let url = URL(string: "http://yourURLhere")!

    let params: [String: String] = ["name": "oskarko", "email": "youremail@here.com", "sex": "male"]



    Alamofire.request(url, method: .post, parameters: params, encoding: URLEncoding.default, headers: nil).validate(statusCode: 200..<600).responseJSON() { response in

        switch response.result {
        case .success:

            var result = [String:String]()

            if let value = response.result.value {

                let json = JSON(value) 

            }

        case .failure(let error):
            print("RESPONSE ERROR: \(error)")

        }

    }

答案 5 :(得分:1)

我刚解决了你遇到的同样问题。问题是我在标题中导入了Alamofire,因此我只是在呼叫请求时删除了Alamofire。像那样:

  

request(.POST,patientIdUrl,参数:nil,headers:nil,encoding:   上传.json)

我希望它可以帮到你。

答案 6 :(得分:1)

我遇到了同样的额外参数&#39;方法&#39;当我的网址变量超出范围时,处于通话错误状态。

在您的情况下,请确保baseUrlnextPatientIdUrl在使用Alamofire.request(patientIdUrl,..)方法时都在范围内。

希望这可以解决您的问题。谢谢你!

答案 7 :(得分:0)

对我而言,这是有效的。

获取GET请求

Alamofire.request("http://jsonplaceholder.typicode.com/todos/1/get").responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            if response.result.value != nil{
                print(response.result.value!)
            }
            break

        case .failure(_):
            print(response.result.error)
            break

        }

    }

对于POST

let parameters = NSDictionary(object: "nara", forKey: "simha" as NSCopying)

    Alamofire.request("http://jsonplaceholder.typicode.com/posts", method: HTTPMethod.post, parameters: parameters as? Parameters, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in


        switch(response.result) {
        case .success(_):
            if response.result.value != nil{
                print(response.result.value!)
            }
            break

        case .failure(_):
            print(response.result.error)
            break

        }
    }

谢谢@ Rajan Maheswari

答案 8 :(得分:0)

我用以下方法解决了这个问题:

  1. 重新排序参数(url然后是方法类型)。
  2. 将编码枚举更改为&#34; JSONEncoding.default&#34;例如。
  3. 请注意:Alamofire方法签名在Swift 3中发生了变化

答案 9 :(得分:0)

我发现值得注意的两件事。

  1. 删除其值前的第一个网址标签。使用 Alamofire.request("https://yourServiceURL.com", method: .post, 而不是Alamofire.request(url: "https://yourServiceURL.com", method: .post,
  2. 确保参数的数据类型为[String: String]。明确声明。

答案 10 :(得分:0)

我从Alamofire复制此代码,创建URLRequest并使用Alamofire.request(URLRequest)方法,避免此错误

originalRequest = try URLRequest(url: url, method: method, headers: headers)
let encodedURLRequest = try encoding.encode(originalRequest!, with: parameters)

答案 11 :(得分:0)

我用这种方式解决了这个问题:

只需移除额外的参数,只需parametersencodingheaders,如果这些参数为零,则可以删除然后离开,

Alamofire.request(yourURLString, method: .post)

答案 12 :(得分:0)

func API()
{
    if Reachability.isConnectedToNetwork()
    {
        let headers = ["Vauthtoken":"Bearer \(apiToken)"]
        print(headers)
        //            let parameter = ["iLimit":"10","iOffset":"0","iThreadId":"1"]
        ApiUtillity.sharedInstance.showSVProgressHUD(text: "Loding...")
        Alamofire.request(ApiUtillity.sharedInstance.API(Join: "vehicle/CurrentVehicleLists"), method:.get, parameters:nil, headers: headers).responseJSON { response in
            switch response.result {
            case .success:
                print(response)
                ApiUtillity.sharedInstance.dismissSVProgressHUD()
                let dictVal = response.result.value
                let dictMain:NSDictionary = dictVal as! NSDictionary
                let statusCode = dictMain.value(forKey: "status") as! Int
                if(statusCode == 200)
                {

                }
                else if statusCode == 401
                {

                }
                else
                {

                }
            case .failure(let error):
                print(error)
                ApiUtillity.sharedInstance.dismissSVProgressHUD()
            }
        }
    } else
    {
        ApiUtillity.sharedInstance.dismissSVProgressHUD()
        ApiUtillity.sharedInstance.showErrorMessage(Title: "Internet Connection", SubTitle: "Internet connection Faild", ForNavigation: self.navigationController!)
    }
}

答案 13 :(得分:0)

如果您在本地添加了Alamofire文件,请不要在请求之前使用“Alamofire”

let apipath = “your api URL”    
    request(apipath, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON { response in switch(response.result) {
            case .success(_):
                do {
                    let JSON = try JSONSerialization.jsonObject(with: response.data! as Data, options:JSONSerialization.ReadingOptions(rawValue: 0))

                    guard let JSONDictionary: NSDictionary = JSON as? NSDictionary else {
                        print("Not a Dictionary")
                        return
                    }

                    print("Post Response : \(JSONDictionary)")
                }
                catch let JSONError as NSError {
                    print("\(JSONError)")
                }
                break
            case .failure(_):
                print("failure Http: \(String(describing: response.result.error?.localizedDescription))")
                break
            }
    }