Desktop version

Main > Forum > 1C:Enterprise Platform > Bugs and functionality requests to 1C:Enterprise platform > How to use json to get distance 2 positon from Google Maps APIs

Forum

Search UsersRules
How to use json to get distance 2 positon from Google Maps APIs
#1
Active user
Points:: 0
Joined:: Jul 3, 2013

Hi Admin!
Hi all!

Before one year ago (2017). I have a 1C script use HTTP Service with JSON POST to get file.json from Google Maps Api services and it works:

Code
&AtServer
Функция СтруктураURI(Знач СтрокаURI) Экспорт
   
   СтрокаURI = СокрЛП(СтрокаURI);
   
   // вообще говоря, не надо учитывать символы после #
   // но для упрощения примера игнорируем такие случаи
   
   // схема
   Схема = "";
   Позиция = Найти(СтрокаURI, "://");
   Если Позиция > 0 Тогда
      Схема = НРег(Лев(СтрокаURI, Позиция - 1));
      СтрокаURI = Сред(СтрокаURI, Позиция + 3);
   КонецЕсли;

   // строка соединения и путь на сервере
   СтрокаСоединения = СтрокаURI;
   ПутьНаСервере = "";
   Позиция = Найти(СтрокаСоединения, "/");
   Если Позиция > 0 Тогда
      ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
      СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
   КонецЕсли;
      
   // информация пользователя и имя сервера
   СтрокаАвторизации = "";
   ИмяСервера = СтрокаСоединения;
   Позиция = Найти(СтрокаСоединения, "@");
   Если Позиция > 0 Тогда
      СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
      ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
   КонецЕсли;
   
   // логин и пароль
   Логин = СтрокаАвторизации;
   Пароль = "";
   Позиция = Найти(СтрокаАвторизации, ":");
   Если Позиция > 0 Тогда
      Логин = Лев(СтрокаАвторизации, Позиция - 1);
      Пароль = Сред(СтрокаАвторизации, Позиция + 1);
   КонецЕсли;
   
   // хост и порт
   Хост = ИмяСервера;
   Порт = "";
   Позиция = Найти(ИмяСервера, ":");
   Если Позиция > 0 Тогда
      Хост = Лев(ИмяСервера, Позиция - 1);
      Порт = Сред(ИмяСервера, Позиция + 1);
   КонецЕсли;
   
   Результат = Новый Структура;
   Результат.Вставить("Схема", Схема);
   Результат.Вставить("Логин", Логин);
   Результат.Вставить("Пароль", Пароль);
   Результат.Вставить("ИмяСервера", ИмяСервера);
   Результат.Вставить("Хост", Хост);
   Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
   Результат.Вставить("ПутьНаСервере", ПутьНаСервере);
   
   Возврат Результат;
   
КонецФункции

&AtServer
Function GetDataFromGoogle()
      
   Try
      ИмяСервера = "https://maps.googleapis.com/maps/api/directions/json?units=metric&origin=Hanoi,%20viet%20nam&destination=Thai%20binh,%20viet%20nam&waypoints=optimize:true|20.665111,%20105.916432&key=AIzaSyCkd8UTXHe7YDb-BUFQjQdtNBTT6TlWOv8";
      
      СтруктураURI = СтруктураURI(ИмяСервера);   
      HTTP = Новый HTTPСоединение(СтруктураURI.Хост,,,,,True);
      
      // Получим временный файл для передачи в теле POST запроса
      ФайлТелаЗапроса = ПолучитьИмяВременногоФайла();   
      ТекстФайл = Новый ТекстовыйДокумент;
      
      ////ТекстФайл.УстановитьТекст(Text);
      ТекстФайл.Записать(ФайлТелаЗапроса, КодировкаТекста.ANSI);
      
      // Получим размер данных для передачи в заголовок
      ФайлНаОтправку = Новый Файл(ФайлТелаЗапроса);
      РазмерФайлаНаОтправку = XMLСтрока(ФайлНаОтправку.Размер());
      
      // Получим временный файл — тело ответа POST запроса
      ФайлРезультат = ПолучитьИмяВременногоФайла();
      
      // Заголовок создадим в виде соответствия
      ЗаголовокЗапросаHTTP = Новый Соответствие();
      
      // Передаем в заголовках размер и тип данных на отправку
      ЗаголовокЗапросаHTTP.Вставить("Content-Length", РазмерФайлаНаОтправку);
      ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=utf-8");
      // Отсылаем POST запрос на обработку.
      // СсылкаНаРесурс — ссылка на веб-сервер (страницу), к которой посылается POST запрос
      СсылкаНаРесурс = СтруктураURI.ПутьНаСервере;
      try
      HTTP.ОтправитьДляОбработки(ФайлТелаЗапроса, СсылкаНаРесурс, ФайлРезультат, ЗаголовокЗапросаHTTP);
      except
          Message(ErrorDescription());
      endtry;
      
      // Получим ответ
      ТекстовыйФайлОтвета = Новый ТекстовыйДокумент;
      ТекстовыйФайлОтвета.Прочитать(ФайлРезультат, КодировкаТекста.UTF8);
      СтрокаОтветаСервера = ТекстовыйФайлОтвета.ПолучитьТекст();
      
      чтениеJSON = Новый ЧтениеJSON;
      чтениеJSON.ОткрытьФайл(ФайлРезультат);
      массивСтруктур = ПрочитатьJSON(чтениеJSON);
   
      If массивСтруктур.status = "OK" AND массивСтруктур.rows[0].elements[0].status = "OK" Then
         Message("Distnace = " + массивСтруктур.rows[0].elements[0].distance.value/1000 + " km"); 
      EndIf;
   Except
      Message("Cannot connection with Google Map API services!");
   EndTry;           
   
EndFunction

But now I use it and get error "Error calling context method (Post): Internet error: The remote host did not pass authentication"

How to fix it?

Thanks in advance!

Profile
#2
Interested
Points:: 0
Joined:: Dec 4, 2017

Dear Hoang Minh Tri,

You try to connect to the Google Maps service via HTTPS protocol. In your code, you need to specify that you use this protocol.

Instead of:

HTTP = Новый HTTPСоединение(СтруктураURI.Хост,,,,,True);

Use:

SSL = Новый ЗащищенноеСоединениеOpenSSL();
HTTP = Новый HTTPСоединение(СтруктураURI.Хост,,,,,,SSL);

Best regards,
Vladimir Gurov

Profile
#3
Just came
Points:: 0
Joined:: Mar 15, 2018

Try the new syntax HTTPСоединение:

Instead

 try
     HTTP.ОтправитьДляОбработки(ФайлТелаЗапроса, СсылкаНаРесурс, ФайлРезультат, ЗаголовокЗапросаHTTP);
     except
         Message(ErrorDescription());
     endtry;

Use

     HTTPЗапрос = Новый HTTPЗапрос(СокрЛП(СсылкаНаРесурс), ЗаголовокЗапросаHTTP);

try
HTTP.ОтправитьДляОбработки(HTTPЗапрос, ФайлРезультат);
except
Message(ErrorDescription());
endtry;

Profile
#4
Active user
Points:: 0
Joined:: Jul 3, 2013

Quote
Vladimir Gurov wrote:
Vladimir Gurov

Thank Vladimir Gurov!
Thank Pavel Kolendo!

I Instead
Code
HTTP = Новый HTTPСоединение(СтруктураURI.Хост,,,,,True); 
HTTP.ОтправитьДляОбработки(ФайлТелаЗапроса, СсылкаНаРесурс, ФайлРезультат, ЗаголовокЗапросаHTTP); 

use
Code
      SSL = Новый ЗащищенноеСоединениеOpenSSL();
      try
      HTTP = Новый HTTPСоединение(СтруктураURI.Хост,,,,,,SSL);
      except
         Message(ErrorDescription());
      endtry;

      // Получим временный файл для передачи в теле POST запроса
      ФайлТелаЗапроса = ПолучитьИмяВременногоФайла();   
      ТекстФайл = Новый ТекстовыйДокумент;
      
      ////ТекстФайл.УстановитьТекст(Text);
      ТекстФайл.Записать(ФайлТелаЗапроса, КодировкаТекста.ANSI);
      
      // Получим размер данных для передачи в заголовок
      ФайлНаОтправку = Новый Файл(ФайлТелаЗапроса);
      РазмерФайлаНаОтправку = XMLСтрока(ФайлНаОтправку.Размер());
      
      // Получим временный файл — тело ответа POST запроса
      ФайлРезультат = ПолучитьИмяВременногоФайла();
      
      // Заголовок создадим в виде соответствия
      ЗаголовокЗапросаHTTP = Новый Соответствие();
      
      // Передаем в заголовках размер и тип данных на отправку
      ЗаголовокЗапросаHTTP.Вставить("Content-Length", РазмерФайлаНаОтправку);
      ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=utf-8");
      // Отсылаем POST запрос на обработку.
      // СсылкаНаРесурс — ссылка на веб-сервер (страницу), к которой посылается POST запрос
      СсылкаНаРесурс = СтруктураURI.ПутьНаСервере;
      HTTPЗапрос = Новый HTTPЗапрос(СокрЛП(СсылкаНаРесурс), ЗаголовокЗапросаHTTP); 
      try 
         HTTP.ОтправитьДляОбработки(HTTPЗапрос, ФайлРезультат); 
      except 
         Message(ErrorDescription()); 
      endtry;   


It Works ok!

Profile
Subscribe
Users browsing this topic (guests: 1, registered: 0, hidden: 0)



© 1C LLC. All rights reserved
1C Company respects the privacy of our customers and visitors
to our Web-site.