Estoy construyendo una pila de red utilizando Alamofire 4 y Swift 3. Tras la Alamofire directrices he creado un router para los extremos de los servicios. Actualmente estoy usando la API gratuito de OpenWeatherMap pero me estoy encontrando problemas con el fin de crear una petición get.
Esa es la url necesaria: http://api.openweathermap.org/data/2.5/weather?q=Rome&APPID=MY_API_KEY. Pegado en un navegador, y mediante una verdadera Clave de la API funciona y me da la espalda de mi agradable json lleno de información sobre el clima en el lugar indicado.
En mi App puedo insertar los parámetros como Diccionario, pero no puedo encontrar una manera para añadir la clave de la api en la final de la url.

Que mi enum router:

enum OWARouter: URLRequestConvertible {
      case byCityName(parameters: Parameters)

//MARK: Url
    static let baseURLString = "http://api.openweathermap.org"
    static let apiKey = "MY_APY_KEY"
    static let pathApiKey = "&APPID=\(apiKey)"  
    var method: HTTPMethod {
        switch self {
        case .byCityName:
            return .get
        }
    }

    var path: String {
        switch self {
        case .byCityName:
            return "/data/2.5/weather"
        }
    }

//MARK: URLRequestConvertible
    func asURLRequest() throws -> URLRequest {
        let url = try OWARouter.baseURLString.asURL()
        var urlRequest = URLRequest(url: url.appendingPathComponent(path))
        switch self {
        case .byCityName(let parameters):
            urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters)
            print((urlRequest.url)!)

        }

        urlRequest.httpMethod = method.rawValue
        return urlRequest
     }
    }

Cuando me registro mi (urlRequest.url)! Tengo este: http://api.openweathermap.org/data/2.5/weather?q=Rome pero no puedo encontrar una manera de agregar el apiKey.
¿Qué estoy haciendo mal?

También he hecho un feo prueba a añadir este código después de la impresión:

        var urlRequest2 = URLRequest(url: (urlRequest.url)!.appendingPathComponent(OWARouter.pathApiKey))
        print("URL2: \(urlRequest2)")

Y el registro es URL2: http://api.openweathermap.org/data/2.5/weather/&APPID=My_API_KEY?q=Roma
¿Cómo es que la clave de la api está en el medio?

Si usted necesita este es el sencillo código de solicitud:

   Alamofire.request(OWARouter.byCityName(parameters: ["q":"Rome"])).responseJSON { response in

           print(response.request)
           print(response.response)
           print(response.data)
           print(response.result)

           debugPrint(response)

           if let JSON = response.result.value {
                   print("json: \(JSON)")
           }
        }

Otra pregunta…
Si puedo usar como parámetros [«q»:»Roma»], mi salida de la url es: http://api.openweathermap.org/data/2.5/weather?q=Rome%2CIT

Cómo mantener la coma?

Gracias!

  • Aquí Coma(,) está codificado con %2C
  • Exactamente… pero aquí me haría falta una url del tipo: api.openweathermap.org/data/2.5/…. Como antes, esta dirección funciona en el navegador.
InformationsquelleAutor DungeonDev | 2016-12-28

4 Comentarios

  1. 3

    Se utiliza por debajo de líneas de código:

    func getRequestAPICall(parameters_name: String)  {
    
            let todosEndpoint: String = "your_server_url" + "parameterName=\(parameters_name)"
    
            Alamofire.request(todosEndpoint, method: .get, encoding: JSONEncoding.default)
                .responseJSON { response in
                    debugPrint(response)
    
                    if let data = response.result.value{
                        //Response type-1
                        if  (data as? [[String : AnyObject]]) != nil{
                            print("data_1: \(data)")
                        }
                        //Response type-2
                        if  (data as? [String : AnyObject]) != nil{
                            print("data_2: \(data)")
                        }
                    }
                }
        }
  2. 1

    He encontrado una solución… la Clave de la Api es simplemente un parámetro para enviar la solicitud. Así, el código para el cambio no está en el router, pero en la función de solicitud:

    Alamofire.request(OWARouter.byCityName(parameters: ["q":"Rome","APPID":"MY_API_KEY"])).responseJSON { response in
    
                print(response.request)
                //print(response.response)
                //print(response.data)
                //print(response.result)
    
                //debugPrint(response)
    
                if let JSON = response.result.value {
                    print("json: \(JSON)")
                }
            }

    EDIT: la coma problema no me da ningún problema ahora. Gracias.

  3. 0

    Swift – 5 Alamofire 5.0 Código Actualizado (sólo Cambio de AF.Método de solicitud de acuerdo a su requerimiento puede agregar Parámetros encabezados y intercepter así )

    AF.request(url, method: .get, encoding: JSONEncoding.default)
            .responseJSON { response in
    
                switch response.result {
    
                case .success(let json):
                    print(json)
                    DispatchQueue.main.async {
    
                     //handle your code 
    
                   }
                case .failure(let error):
                    print(error)
                }
        }
    • sólo una solicitud de cambio de método como por su exigencia puede agregar Parámetros de Encabezados y de Interceptor como bien gracias
    • método de solicitud se puede cambiar de acuerdo a reqirement
  4. -1

    de importación UIKit
    importación Alamofire
    clase APIWRAPPER: NSObject {

    static let instance = APIWRAPPER()
    
    func LoginAPI(Uname : String , Password : String)  {
    
    let requestString = 
    "http://************php/v1/sign-in"
    let params = ["user_name": Uname,
                  "password": Password]
    
    Alamofire.request(requestString,method: .post, parameters: params, encoding: JSONEncoding.prettyPrinted, headers: [:]).responseJSON { (response:DataResponse<Any>) in
    
    switch(response.result) {
    case .success(_):
    if response.result.value != nil
    
    {
    print("response : \(response.result.value!)")
    }
    else
    {
    print("Error")
    }
    break
    case .failure(_):
    print("Failure : \(response.result.error!)")
    break
    }
    }
    }
    }
    • La pregunta era acerca de la petición GET.

Dejar respuesta

Please enter your comment!
Please enter your name here