Подтвердить что ты не робот

Alamofire Swift 3.0 Дополнительный аргумент в вызове

Я перенес свой проект в Swift 3 (и обновил Alamofire до последней версии Swift 3 с pod 'Alamofire', '~> 4.0' в подфайле).

Теперь я получаю ошибку "Дополнительный аргумент в вызове" на каждом Alamofire.request. Например:

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

Может ли кто-нибудь сказать мне, почему?

4b9b3361

Ответ 1

В соответствии с Alamofire документация для URL-адреса версии 4.0.0 с помощью метода 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
}

Надеюсь, это поможет!

Ответ 2

Этот работал для меня.
Нет необходимости удалять параметр кодирования

Обновление для Swift 5.x

Alamofire использует тип Result представленный в Swift 5.
Также Alamofire.request был изменен на AF.request который теперь будет читать их значение response.result переключателя с .success и .failure

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

Swift 3.x/4.x

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]?

В случае Get

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]

Перейдите по ссылке Parameter Encoding Link https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md#parameter-encoding-protocol

Ответ 3

Почтовый метод Alamofire 4.0 с Swift 3.0 и xCode 8.0

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

Ответ 4

Мое решение - если вы используете заголовки, его тип должен быть [String: String].

Ответ 5

Эта ошибка соответствует значению параметров. Он должен быть [String: String]

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

    let params: [String: String] = ["name": "oskarko", "email": "[email protected]", "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)")

        }

    }

Ответ 6

Я только что решил ту же проблему, что и у вас. Проблема в том, что я импортировал Alamofire в заголовок, поэтому я просто удаляю Alamofire при запросе на вызов. Например:

request (.POST, patientIdUrl, параметры: ноль, заголовки: ноль, кодировка:.JSON)

Я надеюсь, что это может вам помочь.

Ответ 7

Я столкнулся с тем же самым дополнительным аргументом 'метод' при вызове, когда моя переменная URL была недоступна.

В вашем случае убедитесь, что оба baseUrl и nextPatientIdUrl находятся в области видимости, когда они используются Alamofire.request(patientIdUrl,..).

Надеюсь, это решит вашу проблему. Спасибо вам!

Ответ 8

Для меня это работает.

Для запроса 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

        }
    }

Спасибо @ Раджан Махешвари.

Ответ 9

Я исправил эту проблему:

  • Параметры порядка (url, затем тип метода).
  • Изменить кодировку Enum как "JSONEncoding.default", например.

Обратите внимание, что: изменение сигнатуры методов Alamofire в Swift 3

Ответ 10

Две вещи, которые я счел достойными внимания.

  • Удалите первую метку URL до ее значения. использование Alamofire.request("https://yourServiceURL.com", method: .post, вместо Alamofire.request(url: "https://yourServiceURL.com", method: .post,.
  • Убедитесь, что тип данных параметров [String: String]. Объявите это явно.

Ответ 11

Я копирую этот код из Alamofire, создаю URLRequest и использую метод Alamofire.request(URLRequest), избегаю этой ошибки

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

Ответ 12

Я исправил эту проблему следующим образом:

Просто удалите дополнительные параметры, только parameters, encoding и headers, если эти параметры равны нулю, вы можете удалить их и оставить таким образом,

Alamofire.request(yourURLString, method: .post)

Ответ 13

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

Ответ 14

Если вы добавили файлы 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
            }
    }

Ответ 15

Я сталкиваюсь с той же проблемой, но с помощью определения параметров, поскольку [String: any] решает мою проблему

 let parameters : [String:any] = ["key":value]