Aktualizacjia stanów magazynowych
Przykład wywołania w PHP
<?php /* * Zaktualizowanie stanów magazynowych wszystkich produktów. * Przykład pokazuje też jak obsługiwać kod -2 (przekroczenie czasu operacji). */ /** * Logowanie do API * * @param resource $c cURL resource handle * @param string $login Login użytkownika * @param string $password Hasło użytkownika * @return string Indentyfikatorr sesji użytkownika */ function login($c, $login, $password) { $params = Array( "method" => "login", "params" => Array($login, $password) ); curl_setopt($c, CURLOPT_POSTFIELDS, "json=" . json_encode($params)); $result = (Array) json_decode(curl_exec($c)); if (isset($result['error'])) { return null; } else { return $result[0]; } } /** * Pobranie id wszystkich produktów * * @param resource $c cURL resource handle * @param String $session Identyfikator sesji * @return Array Tablica id produktów */ function getProductsIds($c, $session) { $params = Array( "method" => "call", "params" => Array($session, "product.list", Array(false, false, false, false, false, null) ) ); $postParams = "json=" . json_encode($params); curl_setopt($c, CURLOPT_POSTFIELDS, $postParams); $result = (Array)json_decode(curl_exec($c)); // sprawdzenie, czy wystąpił błąd if (isset($result['error'])) { echo "Wystąpił błąd: " . $result['error'] . ", kod: " . $result['code']; return Array(); } else { $ids = Array(); foreach ($result as $id) { $ids[] = $id; } return $ids; // lista id produktów } } /** * Aktualizacja produktów * * @param resource $c cURL resource handle * @param String $session Identyfikator sesji * @param Array $ids Tablica id produktów do aktualizacji * @return Array Tablica ze statusami operacji w postaci: id => status */ function updateProducts($c, $session, $ids) { $products = Array(); foreach ($ids as $id) { // id produktu => dane $products[$id] = Array( "stock" => Array( "stock_relative" => 5, // dodanie 5 sztuk do obecnego stanu magazynowego ), // można też dodać inne pola do aktualizacji ); } $params = Array( "method" => "call", "params" => Array($session, "product.list.save", Array($products, true)) ); // zakodowanie parametrów dla metody POST $postParams = "json=" . json_encode($params); curl_setopt($c, CURLOPT_POSTFIELDS, $postParams); // dekodowanie rezultatu w formacie JSON do tablicy result $data = curl_exec($c); $result = (Array)json_decode($data); // sprawdzenie, czy wystąpił błąd if (isset($result['error'])) { echo "Wystąpił błąd: " . $result['error'] . ", kod: " . $result['code']; return null; } else { return $result; } } $c = curl_init(); curl_setopt($c, CURLOPT_URL, 'http://shop.example.com/webapi/json/'); curl_setopt($c, CURLOPT_POST, true); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); // zalogowanie użytkownika i pobranie identyfikatora sesji $session = login($c, "api", "test"); if ($session != null) { $ids = getProductsIds($c, $session); // zapisywanie po 10 produktów while (!empty($ids)) { $idsTmp = array_slice($ids, 0, 10); // weź pierwsze 10 produktów $ids = array_slice($ids, 10); // pozostałe produkty $statuses = updateProducts($c, $session, $idsTmp); if ($statuses != null) { foreach ($statuses as $id => $status) { if ($status == -2) { echo $id . " - operacja się nie udała - zabrakło czasu na zrealizowanie operacji<br>"; // w tym przypadku wrzucamy id produktu z powrotem do tablicy $ids $ids[] = $id; } else if ($status == -1) { echo $id . " - podane dane są nieprawidłowe i nie spełniają wymagań walidacji<br>"; // pomijamy ten produkt } else if ($status == 0) { echo $id . " - operacja się nie udała<br>"; // pomijamy ten produkt } else if ($status == 1) { echo $id . " - produkt został zapisany<br>"; } else if ($status == 2) { echo $id . " - operacja się nie udała - obiekt jest zablokowany przez innego administratora<br>"; // pomijamy ten produkt } } } else { echo "Wystąpił nieznany błąd. Operacja została przerwana."; break; } } } else { echo "Wystąpił błąd logowania"; } curl_close($c); ?>
Przykład wywołania w C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; using System.Web.Script.Serialization; // // Zaktualizowanie stanów magazynowych wszystkich produktów. // Przykład pokazuje też jak obsługiwać kod -2 (przekroczenie czasu operacji). // namespace update_all_products_stocks { class Program { // // Deserializacja stringa w formacie JSON. // public static Object FromJson(string input) { JavaScriptSerializer serializer = new JavaScriptSerializer(); return serializer.Deserialize<Object>(input); } // // Deserializacja obiektu do stringa w formacie JSON. // public static string ToJson(object input) { JavaScriptSerializer serializer = new JavaScriptSerializer(); return serializer.Serialize(input); } // // Wysłanie requestu do api sklepu i zwrócenie wyniku. // public static Object sendApiRequest(String method, Object[] methodParams) { WebRequest request = WebRequest.Create("http://shop.example.com/webapi/json/"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; Stream dataStream = request.GetRequestStream(); Dictionary<String, Object> postParams = new Dictionary<String, Object>(); postParams.Add("method", method); postParams.Add("params", methodParams); string jsonEncodedParams = ToJson(postParams); System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); byte[] byteArray = encoding.GetBytes("json=" + jsonEncodedParams); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); WebResponse webResponse = request.GetResponse(); Stream responseStream = webResponse.GetResponseStream(); StreamReader reader = new StreamReader(responseStream); string text = reader.ReadToEnd(); Object response = FromJson(text); return response; } // // Logowanie do api sklepu. Zwraca identyfikator sesji. // public static String login(String login, String password) { Object[] methodParams = { login, password }; Object response = sendApiRequest("login", methodParams); String session = null; if (response is Dictionary<String, Object>) { Dictionary<String, Object> d = (Dictionary<String, Object>)response; if (d.ContainsKey("error")) { Console.WriteLine("Wystąpił błąd: {0}, kod: {1}", d["error"], d["code"]); } } else if (response is String) { session = (String)response; } return session; } // // Pobranie id wszystkich produktów ze sklepu. // public static List<int> getProductsIds(String session) { List<int> ids = new List<int>(); Object[] methodParams = { session, "product.list", new Object[] { false, false, false, false, false, null} }; Object response = sendApiRequest("call", methodParams); if (response is Dictionary<String, Object>) { Dictionary<String, Object> d = (Dictionary<String, Object>)response; if (d.ContainsKey("error")) { Console.WriteLine("Wystąpił błąd: {0}, kod: {1}", d["error"], d["code"]); } } else if (response is Object[]) { foreach (Object obj in (Object[])response) { ids.Add((int)obj); } } return ids; } // // Aktualizacja produktów o podanych identyfikatorach. // public static Dictionary<int, int> updateProducts(String session, List<int> ids) { Dictionary<int, int> statuses = null; Dictionary<String, Object> products = new Dictionary<String, Object>(); foreach (int id in ids) { Dictionary<String, Object> product = new Dictionary<String, Object>(); Dictionary<String, Object> stock = new Dictionary<String, Object>(); stock.Add("stock_relative", 5); product.Add("stock", stock); products.Add(id.ToString(), product); } Object[] methodParams = { session, "product.list.save", new Object[] { products, true} }; Object response = sendApiRequest("call", methodParams); if (response is Dictionary<String, Object>) { Dictionary<String, Object> d = (Dictionary<String, Object>)response; if (d.ContainsKey("error")) { Console.WriteLine("Wystąpił błąd: {0}, kod: {1}", d["error"], d["code"]); } else { statuses = new Dictionary<int, int>(); foreach (KeyValuePair<String, Object> pair in d) { statuses.Add(int.Parse(pair.Key), (int)pair.Value); } } } return statuses; } static void Main(string[] args) { String session = login("api", "test"); if (session != null) { List<int> ids = getProductsIds(session); while (ids.Count > 0) { int step = Math.Min(ids.Count, 10); List<int> idsTmp = ids.GetRange(0, step); // weź 10 pierwszych produktów ids = ids.GetRange(step, ids.Count - step); // pozostałe produkty // aktualziacja produktów Dictionary<int, int> statuses = updateProducts(session, idsTmp); // sprawdzenie statusów operacji dla każdego produktu if (statuses != null) { foreach (KeyValuePair<int, int> pair in statuses) { int id = pair.Key; int status = pair.Value; switch (status) { case -2: Console.WriteLine(id + " - operacja się nie udała - zabrakło czasu na zrealizowanie operacji"); // w tym przypadku wrzucamy id produktu z powrotem do tablicy ids ids.Add(id); break; case -1: Console.WriteLine(id + " - podane dane są nieprawidłowe i nie spełniają wymagań walidacji"); // pomijamy ten produkt break; case 0: Console.WriteLine(id + " - operacja się nie udała"); // pomijamy ten produkt break; case 1: Console.WriteLine(id + " - produkt został zapisany"); break; case 2: Console.WriteLine(id + " - operacja się nie udała - obiekt jest zablokowany przez innego administratora"); // pomijamy ten produkt break; } } } else { Console.Write("Wystąpił nieznany błąd. Operacja została przerwana."); break; } } } else { Console.WriteLine("Wystąpił błąd logowania"); } Console.ReadKey(); } } }