#ios #json #swift #alamofire #moya
Вопрос:
я использую Moya
библиотеку для вызова api в своем проекте.
теперь один из API-интерфейсов, необходимых для передачи необработанного объекта json(множественный объект как один объект) с запросом POST в теле. в «почтальоне» это работает нормально.
проверьте скриншот ниже,
также проверьте исходное тело json,
{ "geometry": { "location": { "lat": "22.7195687", "lng": "75.8577258" } }, "icon": "https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/geocode-71.png", "name": "Indore", "photos": [ { "photo_reference": "Aap_uECCOLowEnJ2yBUzF0nwRjV5jBx2_JWsofVosuLVvlr-ClIMHNR5-QGIe4phK-3_Bj_laHD_XH_LvlmGDzm33KvxuO1XzaZocxTLOVUdSGI3_otXvpx_FbuzmwiibZiylQEMkekTLKbLdXjK8H3w10nOcoJE-InDVvf5P7Cvyum_kk9k" } ], "place_id": "ChIJ2w1BG638YjkR9EBiNdrEbgk", "reference": "ChIJ2w1BG638YjkR9EBiNdrEbgk", "types": [ "locality", "political" ], "vicinity": "Indore" }, { "geometry": { "location": { "lat": "22.7429365", "lng": "75.8867267" } }, "icon": "https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/generic_business-71.png", "name": "Visual Maker", "photos": [ { "photo_reference": "Aap_uED84yCmvAirxt-dSdPPSE3O_eBSunEiSOM1Uzr0kNNMiJBVvPtBuCuwck2Ek0CDg7S8JP09Iva3Rjhq63O1Tyql_CTeMRF_GWC19QfZUFwwvadcRbfLWo6Wqn4ndCTCh5A6RV212PJcB0HZqe6YV7FphiV_XjkP9pCvk5JLDKNrvOXz" } ], "place_id": "ChIJGwLEIlr9YjkRnr8uTQiQ8KU", "reference": "ChIJGwLEIlr9YjkRnr8uTQiQ8KU", "types": [ "university", "general_contractor", "point_of_interest", "establishment" ], "vicinity": "behind Anop Cinema, K/112, LIG Colony, Indore" }, }
это два объекта, но это могут быть несколько объектов
ниже приведен мой Moya
класс для вызова api.
import Moya import Result import Alamofire import UIKit private func JSONResponseDataFormatter(_ data: Data) -gt; Data { do { let dataAsJSON = try JSONSerialization.jsonObject(with: data) let prettyData = try JSONSerialization.data(withJSONObject: dataAsJSON, options: .prettyPrinted) return prettyData } catch { return data // fallback to original data if it can't be serialized. } } private extension String { var urlEscaped: String { return self.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)! } } let MyAPIProvider = MoyaProviderlt;EBabuAPIgt;( plugins: [VerbosePlugin(verbose: true)]) enum MyAPI { case topPlaceVibeAvg(geometry : [Any], icon:[String], name:[String], photos:[Any], placeIds:[String], reference:[String], types:[Any], vicinity:[Any]) } extension EBabuAPI: TargetType { var headers: [String : String]? { switch self { default: return ["Authorization": SharedPreference.authToken()] } } var baseURL : URL { return URL(string: Constants.API.baseURL)! //["Authorization": "Bearer (Helpers.userToken())"] } var path: String { switch self { case .topPlaceVibeAvg: return "places/topPlaceVibeAvg" } } public var method: Moya.Method { switch self { case .topPlaceVibeAvg : return .post } } var sampleData: Data { return "".data(using: .utf8)! } var task: Task { switch self { case .topPlaceVibeAvg(let geometry,let icon, let name, let photos, let placeIds, let reference, let types, let vicinity): return .requestParameters(parameters: ["geometry":geometry, "icon":icon, "name":name, "photos":photos, "place_id":placeIds, "reference":reference, "types":types, "vicinity":vicinity], encoding: JSONEncoding.default) } } func dicToStrig(data : AnyObject) -gt; String { do { let jsonData = try JSONSerialization.data(withJSONObject: data, options: []) let jsonString = String(data: jsonData, encoding: String.Encoding.ascii)! return jsonString } catch { //handle error print("error",error) } return "" } var parameterEncoding: ParameterEncoding { switch self { default: return JSONEncoding.default } } } struct JsonArrayEncoding: Moya.ParameterEncoding { public static var `default`: JsonArrayEncoding { return JsonArrayEncoding() } public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -gt; URLRequest { var req = try urlRequest.asURLRequest() let json = try JSONSerialization.data(withJSONObject: parameters!["jsonArray"]!, options: JSONSerialization.WritingOptions.prettyPrinted) req.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") req.httpBody = json return req } }
as everyone can see above code i’m trying to call topPlaceVibeAvg api with their keys amp; values api calling successfully but it does not provide proper response same as postman screenshot.
here is api Response: { data = ( ); message = «average fetched successfully!»; statusCode = 200; success = 1; }
i’m using below ViewModel
(placesViewModel) to call api.
var icon = [String]() var name = [String]() var name = [Any]() var placeIds = [String]() var reference = [String]() var testTypes = [Any]() var vicinity = [Any]() var geometry = [Any]() var photos = [Any]() func topPlaceVibeAvg(_ completion: @escaping ((JSONDictionary) -gt; ())) { if !isPullToRefresh { Loader.show("Looking around....") } APIController.makeRequest(.topPlaceVibeAvg(geometry: geometry, icon: icon, name: name, photos: photos, placeIds: placeIds, reference: reference, types: types, vicinity: vicinity)) { (data, error) in Loader.hide() if error == nil { completion(data!) } else { ToastAndAlertManager.showToastWithTitle((error?.desc)!, colorCode: ToastColor.error.rawValue) } } }
here is my ViewController
class for api
placesViewModel.geometry = self.nearByPlacesArray.map{$0.geometry} placesViewModel.icon = self.nearByPlacesArray.map{$0.icon} placesViewModel.name = self.nearByPlacesArray.map{$0.name} placesViewModel.photos = self.nearByPlacesArray.map{$0.photos} placesViewModel.placeIds = self.nearByPlacesArray.map{$0.placeId} placesViewModel.reference = self.nearByPlacesArray.map{$0.reference} placesViewModel.testTypes = self.nearByPlacesArray.map{$0.types} placesViewModel.vicinity = self.nearByPlacesArray.map{$0.vicinity} placesViewModel.topPlaceVibeAvg { (data) in print(data) } Note : **nearByPlacesArray** is main array amp; i'm to sorting my required array object from here
Я действительно пытался справиться с проблемой, я уже искал что-то по этому поводу, но не получил ответов.
У кого-нибудь есть идеи по этому поводу?