【问题标题】:Alamofire 4 Swift 3 GET request with parameters带参数的 Alamofire 4 Swift 3 GET 请求
【发布时间】:2016-12-28 15:12:37
【问题描述】:

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

这是我的枚举路由器:

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

如何保留逗号?

谢谢!

【问题讨论】:

  • 这里Coma(,)用%2C编码
  • 完全正确...但在这里我需要一个类似的网址:api.openweathermap.org/data/2.5/…。和以前一样,这个 url 可以在浏览器上运行。

标签: ios swift xcode api alamofire


【解决方案1】:

用于以下代码行:

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】:

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

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

    【讨论】:

    • 只需根据您的要求更改请求方法,您也可以添加参数标头和拦截器,谢谢
    • 请求方式可根据需求改变
    【解决方案3】:

    我找到了解决方案... 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)")
                }
            }
    

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

    【讨论】:

      【解决方案4】:
      func AlamofireGetCode()
      {
          var url:String!
          url = "https://jsonplaceholder.typicode.com/comments"
      
          Alamofire.request(url, method: .get, encoding: JSONEncoding.default)
              .responseJSON { response in
                  switch response.result{
                      case .success(let json):
                          print(json)
                          DispatchQueue.main.async {
                             print(json)
                             self.mainarray = json as? NSArray
                             print(self.mainarray as Any)
                             self.mytableviewreload.reloadData()
                          }
                      case .failure(let error):
                          print(error)
                      }
              }
      }
      

      【讨论】:

      • 你声明的主数组变量在哪里。
      【解决方案5】:

      Swift 5+ 使用 AF.request

       let todosEndpoint: String = "https://jsonplaceholder.typicode.com/todos/1"
          let request = AF.request(todosEndpoint)
          request.responseJSON { (data) in
              print("Response", data)
          }
      

      【讨论】:

        【解决方案6】:

        **// 拳头在第三方图书馆,安装 pod 'Alamofire' Using Alamofire get json data

        【讨论】:

        • 请给出完整的答案,而不仅仅是发布一个几乎没有解释的链接。
        【解决方案7】:

        导入 UIKit 进口阿拉莫火 类 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: .get, 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
        }
        }
        }
        }
        

        【讨论】:

        • 问题是关于 GET 请求的。
        猜你喜欢
        • 1970-01-01
        • 2015-02-27
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 2019-04-16
        • 2016-11-25
        • 2017-07-14
        • 1970-01-01
        相关资源
        最近更新 更多