Как я могу сделать вызовы API более пригодными для повторного использования с помощью библиотеки AppAuth?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу сделать вызовы API более пригодными для повторного использования с помощью библиотеки AppAuth?

Сообщение Anonymous »

Чтобы освоить разработку приложений на SwiftUI, я создаю простое приложение с функцией входа в систему с использованием библиотеки AppAuth. У меня работают базовые функции входа и выхода из системы, и я могу сделать запрос, используя полученный токен доступа. В настоящее время все запросы выполняются из одного класса. Для реального приложения я бы хотел разделить запросы и разместить их в разных файлах. Вот как я делаю базовый запрос API для получения данных пользователя после входа в систему:

Код: Выделить всё

class AuthStore: ObservableObject {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

private var authState : OIDAuthState?

@Published var isAuthenticated = false

func getUserData() {
let userEndpoint = URL(string: "https://example.com/my-api/user/1")!

self.authState?.performAction() { accessToken, idToken, error in
if error != nil {
print("Error fetching fresh tokens: \(error?.localizedDescription ?? "Unknown error")")
return
}

guard let accessToken = accessToken else {
return
}

// Add Bearer token to request
var urlRequest = URLRequest(url: userEndpoint)
urlRequest.allHTTPHeaderFields = ["Authorization": "Bearer \(accessToken)"]

let task = URLSession.shared.dataTask(with: urlRequest) { data, response, error in

print("Performing patron information request")
if let error = error {
print("Error: \(error.localizedDescription)")
return
}

if let data = data {
do {
let decodedData = try JSONDecoder().decode(User.self, from: data)
self.patron = decodedData
} catch {
print("JSON Decoding error: \(error.localizedDescription)")
}
}
}

task.resume()
}
}
Как сделать запросы API, для которых требуется токен доступа, более универсальными и пригодными для повторного использования? Одним из решений, которое я обдумывал, было использование дженериков, что-то вроде этого:

Код: Выделить всё

func getData(url: URL) -> T {
self.authState?.performAction() { accessToken, idToken, error in
if error != nil {
print("Error fetching fresh tokens: \(error?.localizedDescription ?? "Unknown error")")
return
}

guard let accessToken = accessToken else {
return
}

// Add Bearer token to request
var urlRequest = URLRequest(url: url)
urlRequest.allHTTPHeaderFields = ["Authorization": "Bearer \(accessToken)"]

let task = URLSession.shared.dataTask(with: urlRequest) { data, response, error in

print("Performing patron information request")
if let error = error {
print("Error: \(error.localizedDescription)")
return
}

if let data = data {
do {
let decodedData = try JSONDecoder().decode(T.self, from: data)
self.patron = decodedData
} catch {
print("JSON Decoding error: \(error.localizedDescription)")
}
}
}

task.resume()
}
}
Или было бы лучше добавить в класс AuthStore метод, который возвращает новый токен доступа, который затем можно использовать где-то еще для выполнения запроса?


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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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