Как вернуть из функции данные JSon, которые вернулись из Rest запроса


#1

Коллеги, подскажите пожалуйста как правильно вернуть из функции (используется Xcode 4) произвольные структуры, которые возвращаются из разных запросов rest в post запросе

Вот функция, она успешно отрабатывает, но в зависимости от запроса возвращает разные структуры
Параметр data, который я получаю и разбираю для примера, нужно вернуть во внешнюю функцию
Причем сделать универсально для разных запросов и разных возвращаемых из этой функции структур
Заранее большое спасибо

func makeHTTPPostRequest(path: String, parameters: NSDictionary) -> ??? Как вернуть правильно
{
var Result : ???
Result = nil
guard let url = URL(string: path) else {return Result}

var request = URLRequest(url:url)
request.httpMethod = “POST”
request.addValue(“application/json”, forHTTPHeaderField: “Content-Type”)

guard let httpBody = try? JSONSerialization.data(withJSONObjectarameters, options: []) else {return Result};
request.httpBody=httpBody

let session = URLSession.shared
session.dataTask(with: request){ (data,response,error) in
if let response=response {
print(response)
}

guard let data=data else { return }
Result = JSON(data: data)
do {
let json = try JSONSerialization.jsonObject(with: data, options: [])
print(json)

// пример как я обрабатываю одну из возвращаемых структур одного запроса, а ее нужно просто вернуть
let ReturnParams = try JSONDecoder().decode(OutParams.self, from: data)
print(ReturnParams)
print(“code =” + “(ReturnParams.code!)”);
print(“message =” + “(ReturnParams.message!)”);
print(“passwordHash =” + “(ReturnParams.passwordHash!)”);
print(“type =” + “(ReturnParams.type!)”);

//Result = json.self

} catch {
print(error)
}
}.resume()

return Result
}


#2

Основной запрос в данном случае GET

class NetworkService {

private init() {}
static let shared = NetworkService()


public func getData<T: Decodable>(url: URL, decod: T.Type ,completion: @escaping (Any) -> () ) {
    guard  let url_key = URL(string: API.baseUrl) else { return }
    
    URLSession.shared.dataTask(with: url_key) { (data, response, error) in
        do {
            let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String: AnyObject]
            guard  let dataToken = json["request_token"] as? String else {return}
           
            var request = URLRequest(url: url)
            request.addValue("application/json", forHTTPHeaderField: "Content-Type")
            request.addValue(dataToken , forHTTPHeaderField: "REQUEST-TOKEN")
            request.httpMethod = "GET"
 //                  print(json)
            let session = URLSession.shared
            session.dataTask (with: request) { (data, response, error) in
                if error != nil {
                    print(error as Any)
                    return
                }
                guard let data = data else { return }

                    do {
                        let decoder = JSONDecoder()
                        let json = try decoder.decode(decod.self , from: data)
        //                            print(json)
                        DispatchQueue.main.async {
                            completion(json)
                        }
                    } catch {
                        print(error)
                    }

                }.resume()
        } catch {
            print(error)
        }
        }.resume()
    }

}

Затем запрос для нужной структуры

class SheduleNetworkService {
private init() {}

static func getShedule(complition: @escaping (Schedule) -> ()){
    let currentDate = CurrentDate().date()
    
    guard let url = URL(string:"https://") else { return }
    
    NetworkService.shared.getData(url: url, decod: Schedule.self) { (json) in
        complition(json as! Schedule)
    }
}

}

обработка на нужном Controller’e

 fileprivate func scheduleToday() {
          SheduleNetworkService.getShedule { (response) in
       /// ......
        }
    }
}

как-то так


#3

Большое спасибо за такой подробный ответ.
Если по протоколу на сервере запрос типа POST. Мы можем при вызове в данном приложении поменять на GET запрос?


#4
API.baseUrl это что такое в данном примере - нигде не объявлена

#5

это структура где прописаны URL


#6

в начале запроса нужно немного переписать под POST, у него проще