Как вызвать внутренний API через Alamofire Swift iOSIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как вызвать внутренний API через Alamofire Swift iOS

Сообщение Anonymous »

У меня есть внутренний API, где я получал данные через сеанс URL. Сессия Url довольно сложна для меня, как для новичка, и данные не декодируются должным образом через сеанс URL, теперь кто-то предлагает мне использовать Alamofire. Прочитал документацию alamofire, но все еще не понимаю, как мне получить все данные и показать их в viewController. Пожалуйста, проверьте мой код сеанса URL-адреса и помогите мне преобразовать его в метод Alamofire?
Сетевой класс:
struct NetworkService{
static let shared = NetworkService()
private init(){
}

func fetchAllCategories(completion: @escaping(Result)-> Void){
request(route: .fetchAllCategories, method: .get, completion: completion)
}

private func createRequest(route: Route, method: Method, parameters : [String:Any]? = nil) -> URLRequest?
{

let urlString1 = Route.baseUrl + route.description
guard let url = URL(string: urlString1) else { return nil }
var urlRequest = URLRequest(url: url)
urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.httpMethod = method.rawValue
if let params = parameters{
switch method{
case .get:
var urlComponent = URLComponents(string: urlString1)
urlComponent?.queryItems = params.map {
URLQueryItem(name: $0, value: "\($1)")}
urlRequest.url = urlComponent?.url
case .post, .delete, .patch:
let bodyData = try? JSONSerialization.data(withJSONObject: params, options: [])
urlRequest.httpBody = bodyData
}
}
return urlRequest
}
private func request(route: Route,method: Method, parameters: [String: Any]? = nil, completion: @escaping(Result) -> Void){

guard let request = createRequest(route: route, method: method, parameters: parameters) else {
completion(.failure(AppError.unknownError))
return

}

URLSession.shared.dataTask(with: request){ (data, response, error) in
var result: Result?
if let getData = data{
result = .success(getData)
let respondString = String(data:getData, encoding: .utf8) ?? "could not convert our data into string"
print("backend response is \(respondString)")
}
else if let error = error{
result = .failure(error)
print("error is:\(error.localizedDescription)")
}
DispatchQueue.main.async {
print("success \(result)")
self.handleRequest(result: result , completion: completion)
}
}.resume()

}
private func handleRequest(result:Result?, completion: @escaping(Result) -> Void){
guard let result = result else {
completion(.failure(AppError.unknownError))
return
}

switch result {
case .success(let data):
let decoder = JSONDecoder()
guard let response = try? decoder.decode(ApiResponse.self, from: data) else {
completion(.failure(AppError.errorDecoding))
return
}
if let error = response.error{
completion(.failure(AppError.ServerError(error)))
}
if let decodedData = response.data{
completion(.success(decodedData))

}else{
completion(.failure(AppError.unknownError))
}
case .failure(let error):
completion(.failure(error))
}

}

}

Класс ответа API:
struct ApiResponse : Decodable {
let status: Int
let message: String?
let data: T?
let error: String?

}

Класс AppError:
enum AppError: LocalizedError{
case errorDecoding
case unknownError
case inValidUrl
case ServerError(String)

var errorDescription: String?{
switch self{

case .errorDecoding:
return "response could not be decoded"
case .unknownError:
return "i have no idea what the error is"
case .inValidUrl:
return "give me a valid url"
case .ServerError(let error):
return error
}
}
}

Класс метода:
enum Method: String{
case get = "GET"
case post = "POST"
case delete = "DELETE"
case patch = "PATCH"
}

Класс маршрутизации — это тот, который возвращает все данные категорий и возвращает результат.
enum Route{
static let baseUrl = "https://yummie.glitch.me"
case fetchAllCategories
var description: String{
switch self{
case .fetchAllCategories:
return "/dish-categories"
}
}
}

Класс домашнего контроллера:
var categoresdish: [DishCategory] = []{
didSet{
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
var popular: [Dish] = []{
didSet{
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
var specials: [Dish] = []{
didSet{
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}

private func loadData(){
//ProgressHUD.show()
NetworkService.shared.fetchAllCategories { [weak self] (result) in
switch result{

case .success(let allDishes):
// ProgressHUD.dismiss()
print("faheem ios success")
self?.categoresdish = allDishes.categories ?? []
self?.popular = allDishes.populars ?? []
self?.specials = allDishes.specials ?? []

case .failure(let error):
print("faheem error is \(error.localizedDescription)")
ProgressHUD.showError()
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.loadData()
}


Подробнее здесь: https://stackoverflow.com/questions/694 ... -swift-ios
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Alamofire 5 показывает ошибку после установки с помощью Carthage: «У Alamofire нет участника с именем request»
    Гость » » в форуме IOS
    0 Ответы
    145 Просмотры
    Последнее сообщение Гость
  • Вызов API в Swift с Alamofire?
    Anonymous » » в форуме IOS
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Вызов API в Swift с Alamofire?
    Anonymous » » в форуме IOS
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Twitter API в SWIFT через Alamofire
    Anonymous » » в форуме IOS
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Swift/Alamofire/API-токен/Отсутствует обязательный параметр:grant_type
    Anonymous » » в форуме IOS
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»