source - Alamofire Swift 3.0 Argumento adicional en llamada
swiftyjson alamofire (14)
Método de publicación Alamofire 4.0 con Swift 3.0 y xCode 8.0
Alamofire.request(URL, method: .post, parameters: PARAMS)
.responseJSON { closureResponse in
if String(describing: closureResponse.result) == "SUCCESS"
{
// Sucess code
}
else
{
// Failure Code
}
}
He migrado mi proyecto a Swift 3 (y actualicé Alamofire a la última versión de Swift 3 con el
pod ''Alamofire'', ''~> 4.0''
en el Podfile).
Ahora aparece el error "Argumento adicional en la llamada" en cada solicitud de Alamofire.request. P.ej:
let patientIdUrl = baseUrl + nextPatientIdUrl
Alamofire.request(.POST, patientIdUrl, parameters: nil, headers: nil, encoding: .JSON)
Puede alguien decirme por qué ?
Acabo de resolver el mismo problema que tú tienes. El problema es que he importado Alamofire en el encabezado, así que solo elimino el Alamofire cuando solicito una llamada. Como eso:
solicitud (.POST, patientIdUrl, parámetros: nil, encabezados: nil, codificación: .JSON)
Espero que te pueda ayudar.
Copio este código de Alamofire, creo una URLRequest y utilizo el método Alamofire.request (URLRequest), evito este error
originalRequest = try URLRequest(url: url, method: method, headers: headers)
let encodedURLRequest = try encoding.encode(originalRequest!, with: parameters)
Dos cosas que encontré dignas de mención.
-
Elimine la primera etiqueta de URL antes de su valor.
Utilice
Alamofire.request("https://yourServiceURL.com", method: .post,
lugar deAlamofire.request(url: "https://yourServiceURL.com", method: .post,
-
Asegúrese de que el tipo de datos de los parámetros es
[String: String]
. Declararlo explícitamente.
Este error depende del valor de los parámetros. Tiene que ser [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)")
}
}
Este me funcionó.
No es necesario eliminar el parámetro de
codificación
Actualización para Swift 5.x
Alamofire usa el tipo de
Result
introducido en
Swift 5
.
También
Alamofire.request
se ha cambiado a
AF.request
que ahora leerá su valor de
response.result
con
.success
y
.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
}
}
y asegúrese de que los parámetros sean de tipo
[String:Any]?
En caso de obtener
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
}
}
Incluso trabaja con
JSONEncoding.default
Para encabezados
Si está pasando encabezados, asegúrese de que su tipo sea
[String:String]
Ir a través del
Parameter Encoding Link
https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md#parameter-encoding-protocol
Me encontré con este mismo ''método'' de argumento adicional en el error de llamada cuando mi variable de URL estaba fuera de alcance .
En su caso, asegúrese de que tanto
baseUrl
como
nextPatientIdUrl
estén dentro del alcance cuando se utilizan el
Alamofire.request(patientIdUrl,..)
.
Esperemos que esto resuelva tu problema. ¡Gracias!
Mi solución es si está usando encabezados, su tipo debe ser [String: String].
Para mí esto está funcionando.
Para obtener una solicitud
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
}
}
Para 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
}
}
Gracias @ Rajan Maheswari .
Según la documentación de Alamofire para la versión 4.0.0, la solicitud de URL con el método HTTP sería la siguiente:
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)
Entonces su solicitud de URL será:
Alamofire.request(patientIdUrl, method: .post, parameters: nil, encoding: JSONEncoding.default, headers: nil)
y una solicitud de muestra será:
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
}
¡Espero que esto ayude!
Si ha agregado archivos de Alamofire localmente, no use "Alamofire" antes de solicitar
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
}
}
Solucioné este problema con:
- Reordenar parámetros (url luego tipo de método).
- Cambie Enumding Enum para que sea "JSONEncoding.default", por ejemplo.
Tenga en cuenta que: los métodos de Alamofire cambian la firma en Swift 3
Solucioné este problema de esta manera:
Simplemente elimine los parámetros adicionales, solo los
parameters
, la
encoding
y los
headers
, si estos parámetros son nulos, puede eliminarlos y salir de esta manera,
Alamofire.request(yourURLString, method: .post)
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!)
}
}