带参数的 Alamofire 4 Swift 3 GET 请求
Posted
技术标签:
【中文标题】带参数的 Alamofire 4 Swift 3 GET 请求【英文标题】:Alamofire 4 Swift 3 GET request with parameters 【发布时间】: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 可以在浏览器上运行。
【参考方案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 请求的。以上是关于带参数的 Alamofire 4 Swift 3 GET 请求的主要内容,如果未能解决你的问题,请参考以下文章
如何使用参数 swift 3.0 Alamofire 4.0 调用邮政服务?