Реализация функций на C#
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Web.Script.Serialization; public class PSCWebApi { private const string BaseUrl = "https://pscw.autoxp.ru/api.aspx"; private string _sessionToken; private readonly string _licenseKey; private readonly string _syncCode; public PSCWebApi(string licenseKey, string syncCode) { _licenseKey = licenseKey; _syncCode = syncCode; } #region Core Methods private string GetRequest(Dictionary<string, string> parameters) { var queryString = string.Join("&", parameters.Select(kvp => $"{kvp.Key}={WebUtility.UrlEncode(kvp.Value)}")); var request = WebRequest.Create($"{BaseUrl}?{queryString}"); request.Method = "GET"; using (var response = request.GetResponse()) using (var reader = new StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } } private string PostRequest(Dictionary<string, string> parameters) { var request = WebRequest.Create(BaseUrl); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; var postData = string.Join("&", parameters.Select(kvp => $"{kvp.Key}={WebUtility.UrlEncode(kvp.Value)}")); var byteArray = Encoding.UTF8.GetBytes(postData); using (var dataStream = request.GetRequestStream()) { dataStream.Write(byteArray, 0, byteArray.Length); } using (var response = request.GetResponse()) using (var reader = new StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } } private string UploadFile(string url, Dictionary<string, string> parameters, string filePath) { var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); var request = WebRequest.Create(url); request.Method = "POST"; request.ContentType = "multipart/form-data; boundary=" + boundary; using (var requestStream = request.GetRequestStream()) using (var writer = new StreamWriter(requestStream)) { // Add parameters foreach (var param in parameters) { writer.WriteLine("--{0}", boundary); writer.WriteLine("Content-Disposition: form-data; name=\"{0}\"", param.Key); writer.WriteLine(); writer.WriteLine(param.Value); } // Add file var fileName = Path.GetFileName(filePath); writer.WriteLine("--{0}", boundary); writer.WriteLine("Content-Disposition: form-data; name=\"file\"; filename=\"{0}\"", fileName); writer.WriteLine("Content-Type: application/octet-stream"); writer.WriteLine(); writer.Flush(); using (var fileStream = File.OpenRead(filePath)) { fileStream.CopyTo(requestStream); } writer.WriteLine(); writer.WriteLine("--{0}--", boundary); writer.Flush(); } using (var response = request.GetResponse()) using (var reader = new StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } } #endregion #region API Methods // Авторизация в системе public bool Login() { var parameters = new Dictionary<string, string> { {"keynumber", _licenseKey}, {"codesync", _syncCode} }; var response = GetRequest(parameters); if (response.StartsWith("!")) { throw new Exception(response); } var serializer = new JavaScriptSerializer(); var result = serializer.Deserialize<Dictionary<string, string>>(response); _sessionToken = result["ses"]; return !string.IsNullOrEmpty(_sessionToken); } // Получение списка документов public Dictionary<string, object> GetDocumentsList(string fields = "", int count = 200) { var parameters = new Dictionary<string, string> { {"ses", _sessionToken}, {"task", "listofdocs"} }; if (!string.IsNullOrEmpty(fields)) parameters.Add("fields", fields); if (count != 200) parameters.Add("countofdocs", count.ToString()); var response = PostRequest(parameters); if (response.StartsWith("!")) { throw new Exception(response); } var serializer = new JavaScriptSerializer(); return serializer.Deserialize<Dictionary<string, object>>(response); } // Создание нового документа public string CreateDocument(string templateCode) { var parameters = new Dictionary<string, string> { {"ses", _sessionToken}, {"bnk", templateCode} }; var response = GetRequest(parameters); if (response.StartsWith("!")) { throw new Exception(response); } var serializer = new JavaScriptSerializer(); var result = serializer.Deserialize<Dictionary<string, string>>(response); return result["doc"]; } // Получение значения поля документа public string GetFieldValue(string documentId, string fieldName) { var parameters = new Dictionary<string, string> { {"ses", _sessionToken}, {"doc", documentId}, {"frmfield", fieldName} }; var response = GetRequest(parameters); if (response.StartsWith("!")) { throw new Exception(response); } var serializer = new JavaScriptSerializer(); var result = serializer.Deserialize<Dictionary<string, string>>(response); return result["val"]; } // Установка значения поля документа public void SetFieldValue(string documentId, string fieldName, string value) { var parameters = new Dictionary<string, string> { {"ses", _sessionToken}, {"doc", documentId}, {"frmfield", fieldName}, {"val", value ?? "null"} }; var response = PostRequest(parameters); if (response.StartsWith("!")) { throw new Exception(response); } } // Добавление изображения в документ public void AddImage(string documentId, string galleryId, string imagePath, string comment = null, string geoLat = null, string geoLon = null) { var parameters = new Dictionary<string, string> { {"ses", _sessionToken}, {"doc", documentId}, {"task", "addimage"}, {"gallery", galleryId} }; if (!string.IsNullOrEmpty(comment)) parameters.Add("comment", comment); if (!string.IsNullOrEmpty(geoLat)) parameters.Add("geoposlat", geoLat); if (!string.IsNullOrEmpty(geoLon)) parameters.Add("geoposlon", geoLon); var response = UploadFile(BaseUrl, parameters, imagePath); if (response.StartsWith("!")) { throw new Exception(response); } } // Получение статуса документа public string GetDocumentStatus(string documentId) { var parameters = new Dictionary<string, string> { {"ses", _sessionToken}, {"doc", documentId}, {"task", "getdocstatus"} }; var response = GetRequest(parameters); if (response.StartsWith("!")) { throw new Exception(response); } var serializer = new JavaScriptSerializer(); var result = serializer.Deserialize<Dictionary<string, string>>(response); return result["docstatus"]; } // Установка статуса документа public void SetDocumentStatus(string documentId, string status) { var parameters = new Dictionary<string, string> { {"ses", _sessionToken}, {"doc", documentId}, {"task", "setdocstatus"}, {"val", status} }; var response = GetRequest(parameters); if (response.StartsWith("!")) { throw new Exception(response); } } #endregion }
Пример использования
var api = new PSCWebApi("ВАШ_LICENSE_KEY", "ВАШ_SYNC_CODE"); // Авторизация if (api.Login()) { // Создание документа ОСАГО var docId = api.CreateDocument("AST00100"); // Установка значений полей api.SetFieldValue(docId, "model", "TOYOTA Corolla"); api.SetFieldValue(docId, "vin", "NMTBB01190R111111"); // Добавление изображения api.AddImage( docId, "imgBROWSE", @"C:\photos\car_front.jpg", "Фото спереди", "55.7558", "37.6173"); // Установка статуса api.SetDocumentStatus(docId, "Готов"); }