IOS создает общий запрос Alamofire, используя SwiftIOS

Программируем под IOS
Ответить
Anonymous
 IOS создает общий запрос Alamofire, используя Swift

Сообщение Anonymous »

Недавно я начал изучать разработку приложений для iOS с использованием Swift, поэтому я новичок в этом. Я хочу реализовать вызов rest API в Swift и обнаружил, что мы можем добиться этого с помощью URLRequest. Итак, я написал универсальный метод для вызова всех типов (например, get, put, post) rest API, как показано ниже.

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

import Foundation
//import Alamofire

public typealias JSON = [String: Any]
public typealias HTTPHeaders = [String: String];

public enum RequestMethod: String {
case get = "GET"
case post = "POST"
case put = "PUT"
case delete = "DELETE"
}
public enum Result {
case success(Value)
case failure(Error)
}
public class apiClient{
private  var base_url:String = "https://api.testserver.com/"
private func apiRequest(endPoint: String,
method: RequestMethod,
body: JSON? = nil,
token: String? = nil,
completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) {
let url = URL(string: (base_url.self + endPoint))!
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = method.rawValue
urlRequest.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
if let token = token {
urlRequest.setValue("bearer " + token, forHTTPHeaderField: "Authorization")
}
if let body = body {
urlRequest.httpBody = try? JSONSerialization.data(withJSONObject: body)
}
let session = URLSession(configuration: .default)
let task = session.dataTask(with: urlRequest) { data, response, error in
//NSLog(error)
completionHandler(data, response, error)
}
task.resume()
}
public func sendRequest(for: T.Type = T.self,
endPoint: String,
method: RequestMethod,
body: JSON? = nil,
token: String? = nil,
completion: @escaping (Result) -> Void) {
return apiRequest(endPoint: endPoint, method: method, body:body, token: token) { data, response, error in
guard let data = data else {
return completion(.failure(error ?? NSError(domain: "SomeDomain", code: -1, userInfo: nil)))
}
do {
let decoder = JSONDecoder()
try completion(.success(decoder.decode(T.self, from: data)))
} catch let decodingError {
completion(.failure(decodingError))
}
}
}
}
вот как я называю это методом контроллера

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

public func getProfile(userId :Int, objToken:String) -> Void {
let objApi = apiClient()
objApi.sendRequest(for: ProfileDetails.self,
endPoint:"api/user/profile/\(userId)",
method: .get,
token: objToken,
completion:
{(userResult: Result
) -> Void in
switch userResult
{
case .success(let value):
if value.respCode == "01" {
print(value.profile)
do {
//...  ddo some taks like store response in local db or else
} catch let error as NSError {
// handle error
print(error)
}
}
else {
//do some task
}
break
case .failure(let error):
print(error)
break
}
})
}
Я декодирую ответ сервера в приведенной ниже модели

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

class ProfileDetails : Response, Decodable {
var appUpdate : AppUpdate?
var profile : Profile?

enum CodingKeys: String, CodingKey {
case profile = "profile"
case respCode = "resp_code"
case respMsg = "resp_msg"
}
public required convenience init(from decoder: Decoder) throws {
self.init()
let values = try decoder.container(keyedBy: CodingKeys.self)
self.profile = try values.decodeIfPresent(Profile.self, forKey: .profile)
self.respCode = try values.decodeIfPresent(String.self, forKey: .respCode)!
self.respMsg = try values.decodeIfPresent(String.self, forKey: .respMsg)
}
}
Этот код не может обрабатывать ответ об ошибке, такой как 401, 404 и т. д., с сервера. Итак, мне нужно преобразовать этот API (

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

URLRequest
)запрос на общий запрос Alamofire[/b] с обработкой ошибок, например 401, 404 и т. д. У меня установлены модули Alamofire. Есть ли кто-нибудь, кто разработал общий метод запроса Alamofire с декодированием и обработкой ошибок?

Заранее спасибо :)

Подробнее здесь: https://stackoverflow.com/questions/603 ... sing-swift
Ответить

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

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

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

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

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