2016-12-28 8 views
1

Ich baue einen Netzwerkstack mit Alamofire 4 und Swift 3. Nach den Alamofire Richtlinien habe ich einen Router für die Endpunkte der Dienste erstellt. Ich verwende derzeit die freie API von OpenWeatherMap, aber ich finde Probleme, um eine Anfrage zu erstellen. Das ist die URL benötigt: http://api.openweathermap.org/data/2.5/weather?q=Rome&APPID=MY_API_KEY. In einem Browser eingefügt, und mit einem echten API-Schlüssel funktioniert es und gibt mir meinen schönen JSON mit Informationen über das Wetter an dem angegebenen Ort zurück. In meiner App kann ich die Parameter als Dictionary einfügen, aber ich finde keine Möglichkeit, den API-Schlüssel am Ende der URL anzuhängen.Alamofire 4 Swift 3 GET Anfrage mit Parametern

Das ist mein 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 
    } 
    } 

Als ich meine (URLRequest.url) log! Ich habe das: http://api.openweathermap.org/data/2.5/weather?q=Rome, aber ich kann keinen Weg finden, den apiKey hinzuzufügen. Was mache ich falsch?

Ich habe auch eine hässliche Test Hinzufügen diesen Code nach dem Druck gemacht:

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

und das Protokoll ist URL2: http://api.openweathermap.org/data/2.5/weather/&APPID=My_API_KEY?q=Rome Wie kommt der api-Schlüssel in der Mitte?

Wenn Sie dies ist die einfache Anforderungscode:

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

Eine andere Frage ... Wenn ich als Parameter verwenden [ "q": "Rom, IT"], meine Ausgabe url ist: http://api.openweathermap.org/data/2.5/weather?q=Rome%2CIT

Wie das Komma behalten?

Vielen Dank!

+0

Hier 'Coma (,)' mit% 2C –

+0

Genau codiert ... aber hier würde ich eine URL benötigen wie: http: //api.openweathermap.org/data/2.5/weather?q=Rome,It&APPID=MY_API_KEY. Wie zuvor funktioniert diese URL im Browser. – DungeonDev

Antwort

1

Ich habe eine Lösung gefunden ... der Api Key ist einfach ein Parameter an die Anfrage zu senden. So ist der Code zu ändern ist nicht im Router aber in der Anfrage-Funktion:

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: das Komma Ausgabe gibt mir kein Problem jetzt. Vielen Dank.

0

Import UIKit Import Alamofire Klasse 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 
} 
} 
} 
}