2016-12-28 188 views
1

我正在使用Alamofire 4和Swift 3构建网络堆栈。遵循Alamofire指南,我为服务的端点创建了一个路由器。我目前使用OpenWeatherMap的免费API,但我发现问题才能创建获取请求。 这就是所需的网址:http://api.openweathermap.org/data/2.5/weather?q=Rome&APPID=MY_API_KEY。在浏览器上粘贴,并使用一个真正的API密钥它的作品,并让我回到我的好json的信息有关天气在给定的位置。 在我的应用程序,我可以插入参数作为词典,但我无法找到一种方法来追加在URL的末尾的api键。Alamofire 4 Swift 3 GET请求参数

这是我的枚举路由器:

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

当我登录我的(URLRequest.url中)!我有这个:http://api.openweathermap.org/data/2.5/weather?q=Rome但我找不到添加apiKey的方法。 我在做什么错?

,我也做了一个丑陋的测试打印后添加以下代码:

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

和日志是URL2:http://api.openweathermap.org/data/2.5/weather/&APPID=My_API_KEY?q=Rome 为什么API密钥是在中间?

如果您需要这是一个简单的请求代码:

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

另一个问题...... 如果我作为参数使用[“Q”:“罗马,IT”],我的输出网址为:http://api.openweathermap.org/data/2.5/weather?q=Rome%2CIT

如何保留逗号?

谢谢!

+0

这里'昏迷(,)'进行编码%2C –

+0

没错......但在这里,我需要一个像网址:HTTP: //api.openweathermap.org/data/2.5/weather?q=Rome,It&APPID=MY_API_KEY。 与以前一样,此网址适用于浏览器。 – DungeonDev

回答

1

我发现了一个解决方案... Api Key只是一个发送到请求的参数。所以改变的代码是不是在路由器,但在请求功能:

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

编辑:逗号问题现在不给我任何问题。谢谢。

0

进口的UIKit 进口Alamofire 类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 
} 
} 
} 
}