logo

[ELMA3] Примеры работы с WebAPI

Использование сторонних API позволяет существенно расширить функционал системы. В статье ниже рассмотрены 2 примера по работе с GET и POST-запросами.

В большинстве случаев сервисы являются платными, однако предоставляется возможность создавать несколько тысяч бесплатных запросов в месяц, чего вполне достаточно для небольшой или средней компании.

1. POST-запрос

Для примера воспользуемся API сервисом dadata.ru - один из методов позволяет получить адрес юридического лица или ИП по ИНН/ОГРН (https://dadata.ru/api/find-party/).

Для начала работы с сервисом необходимо пройти регистрацию и получить токен авторизации.

//указываем url, к которому будем обращаться
var url = "https://suggestions.dadata.ru/suggestions/api/4_1/rs/findById/party";
		
//генерация запроса
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
req.Method = "POST";
req.Timeout = 10000;
req.Headers.Add("Authorization", "Token 92********************************ce");  //указываем токен, полученный при регистрации
req.ContentType = "application/json";
req.Accept = "application/json";

 //данные для отправки
 var sentData = Encoding.UTF8.GetBytes("{ \"query\": \""+context.OGRN+"\" }"); //т.к. тело запроса небольшое, генерируем его строкой
 req.ContentLength = sentData.Length;
 Stream sendStream = req.GetRequestStream();
 sendStream.Write(sentData, 0, sentData.Length);

//получение ответа
var res = req.GetResponse() as HttpWebResponse;
var resStream = res.GetResponseStream();
var sr = new StreamReader(resStream, Encoding.UTF8);

Для более простой обработки полученный ответ можно десериализовать. Для этого можно воспользоваться сторонним сервисом, например http://json2csharp.com.

Сохраним полученный ответ в строку, например:

var context.Log = sr.ReadToEnd();

Полученную строку вставим в поле http://json2csharp.com. После нажатия кнопки Generate скопируем полученные классы в сценарий вне тела метода, в данном случае полученный ответ будет следующим:

public class Management
        {
            public string name { get; set; }
            public string post { get; set; }
        }

        public class State
        {
            public string status { get; set; }
            public long actuality_date { get; set; }
            public long registration_date { get; set; }
            public object liquidation_date { get; set; }
        }

        public class Opf
        {
            public object type { get; set; }
            public string code { get; set; }
            public string full { get; set; }
            public string @short { get; set; }
        }

        public class Name
        {
            public string full_with_opf { get; set; }
            public string short_with_opf { get; set; }
            public object latin { get; set; }
            public string full { get; set; }
            public string @short { get; set; }
        }

        public class Data2
        {
            public string postal_code { get; set; }
            public string country { get; set; }
            public string region_fias_id { get; set; }
            public string region_kladr_id { get; set; }
            public string region_with_type { get; set; }
            public string region_type { get; set; }
            public string region_type_full { get; set; }
            public string region { get; set; }
            public object area_fias_id { get; set; }
            public object area_kladr_id { get; set; }
            public object area_with_type { get; set; }
            public object area_type { get; set; }
            public object area_type_full { get; set; }
            public object area { get; set; }
            public string city_fias_id { get; set; }
            public string city_kladr_id { get; set; }
            public string city_with_type { get; set; }
            public string city_type { get; set; }
            public string city_type_full { get; set; }
            public string city { get; set; }
            public string city_area { get; set; }
            public object city_district_fias_id { get; set; }
            public object city_district_kladr_id { get; set; }
            public string city_district_with_type { get; set; }
            public string city_district_type { get; set; }
            public string city_district_type_full { get; set; }
            public string city_district { get; set; }
            public object settlement_fias_id { get; set; }
            public object settlement_kladr_id { get; set; }
            public object settlement_with_type { get; set; }
            public object settlement_type { get; set; }
            public object settlement_type_full { get; set; }
            public object settlement { get; set; }
            public string street_fias_id { get; set; }
            public string street_kladr_id { get; set; }
            public string street_with_type { get; set; }
            public string street_type { get; set; }
            public string street_type_full { get; set; }
            public string street { get; set; }
            public string house_fias_id { get; set; }
            public string house_kladr_id { get; set; }
            public string house_type { get; set; }
            public string house_type_full { get; set; }
            public string house { get; set; }
            public object block_type { get; set; }
            public object block_type_full { get; set; }
            public object block { get; set; }
            public object flat_type { get; set; }
            public object flat_type_full { get; set; }
            public object flat { get; set; }
            public object flat_area { get; set; }
            public object square_meter_price { get; set; }
            public object flat_price { get; set; }
            public object postal_box { get; set; }
            public string fias_id { get; set; }
            public string fias_level { get; set; }
            public string kladr_id { get; set; }
            public string capital_marker { get; set; }
            public string okato { get; set; }
            public string oktmo { get; set; }
            public string tax_office { get; set; }
            public string tax_office_legal { get; set; }
            public object timezone { get; set; }
            public string geo_lat { get; set; }
            public string geo_lon { get; set; }
            public object beltway_hit { get; set; }
            public object beltway_distance { get; set; }
            public object metro { get; set; }
            public string qc_geo { get; set; }
            public object qc_complete { get; set; }
            public object qc_house { get; set; }
            public object history_values { get; set; }
            public object unparsed_parts { get; set; }
            public string source { get; set; }
            public object qc { get; set; }
        }

        public class Address
        {
            public string value { get; set; }
            public string unrestricted_value { get; set; }
            public Data2 data { get; set; }
        }

        public class Data
        {
            public string kpp { get; set; }
            public object capital { get; set; }
            public Management management { get; set; }
            public string branch_type { get; set; }
            public int branch_count { get; set; }
            public object source { get; set; }
            public object qc { get; set; }
            public string hid { get; set; }
            public string type { get; set; }
            public State state { get; set; }
            public Opf opf { get; set; }
            public Name name { get; set; }
            public string inn { get; set; }
            public string ogrn { get; set; }
            public object okpo { get; set; }
            public string okved { get; set; }
            public object okveds { get; set; }
            public object authorities { get; set; }
            public object documents { get; set; }
            public object licenses { get; set; }
            public Address address { get; set; }
            public object phones { get; set; }
            public object emails { get; set; }
            public long ogrn_date { get; set; }
            public string okved_type { get; set; }
        }

        public class Suggestion
        {
            public string value { get; set; }
            public string unrestricted_value { get; set; }
            public Data data { get; set; }
        }

        public class RootObject
        {
            public List<Suggestion> suggestions { get; set; }
        }

Теперь мы сможем десериализовать полученный JSON:

var dict = JsonConvert.DeserializeObject<RootObject>(sr.ReadToEnd());

Из данного объекта мы сможем получить контактный адрес контрагента:

var address = EntityManager<EleWise.ELMA.CRM.Models.Address>.Instance.Create();
address.City = dict.suggestions[0].data.address.data.city;
address.Street = dict.suggestions[0].data.address.data.street;
address.Building = dict.suggestions[0].data.address.data.house;
address.Save();
context.Kontragent.LegalAddress = address;
 context.Kontragent.PostalAddress = address;
context.Kontragent.Save();

2. GET-запрос

Для примера воспользуемся API Google – данный сервис позволяет, например, ввести данные в произвольном виде и получить формализованное представление адреса.

Для начала работы с сервисом необходимо получить токен авторизации.

String token = "A******************************************Y";

//параметры запроса передаём в самом url, к которому будем обращаться
var url = string.Format("https://maps.googleapis.com/maps/api/geocode/json?address={0}&key={1}&language=ru", context.StrokaVvodaAdresa.Replace(" ", "+"), token);
            
//генерация запроса
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
req.Method = "GET";
req.Timeout = 10000;
            
//получение ответа
var res = req.GetResponse() as HttpWebResponse;
var resStream = res.GetResponseStream();
var sr = new StreamReader(resStream, Encoding.UTF8);

 //получаем  необходимые данные
//сериализация происходит так же, как в примере с post-запросом
var dict = JsonConvert.DeserializeObject<RootObject>(sr.ReadToEnd());
dict.results.ForEach(i => Console.WriteLine(i.formatted_address));

Для реализации потребуются следующие библиотеки:

using System.Net;
using System.IO;
using Newtonsoft.Json.