ios - 带参数的 Alamofire 4 Swift 3 GET 请求

标签 ios swift xcode api alamofire

我正在使用 Alamofire 4 和 Swift 3 构建网络堆栈。按照 Alamofire 指南,我为服务端点创建了一个路由器。我目前正在使用 OpenWeatherMap 的免费 API,但在创建获取请求时发现问题。 这就是所需的网址:http://api.openweathermap.org/data/2.5/weather?q=Rome&APPID=MY_API_KEY .粘贴在浏览器上,并使用真正的 API key ,它可以工作,并返回我漂亮的 json,其中包含给定位置的天气信息。 在我的应用程序上,我可以将参数作为字典插入,但我找不到在 url 末尾附加 api key 的方法。

那是我的枚举路由器:

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 key怎么在中间?

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

   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":"Rome, IT"],我的输出 url 是:http://api.openweathermap.org/data/2.5/weather?q=Rome%2CIT

如何保留逗号?

谢谢!

最佳答案

Swift - 5 Alamofire 5.0 更新代码(只需根据您的要求更改 AF.request 方法,您还可以添加参数 header 和拦截器)

Alamofire.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)
            }
    }

关于ios - 带参数的 Alamofire 4 Swift 3 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41364794/

相关文章:

ios - 定位到哪个版本的iPhone/iPod Touch

iOS webView 向左或向右滑动以导航

ios - Xcode:momc 无法在旧项目中编译 .mom 文件

swift - 二元运算符 '==' 不能应用于类型 '[MKAnnotation]' 和 'MKAnnotation' 的操作数

ios - 是否可以使用 IMDF 从 Apple 创建像机场一样的 IndoorMaps?

XCode C/C++ 标志 Bash 脚本

ios - 警告 ITMS-90176 - 无法识别的语言环境 base.lproj

ios - UICollectionView 滚动到没有动画的最后一项

ios - 与 sprite kit 和 swift 颜色匹配

ios - 在某些操作系统版本中未调用 WKHTTPCookieStore getAllCookies 完成处理程序