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)
Может ли кто-нибудь сказать мне, почему?
Ответы
Ответ 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]