How to use json to get distance 2 positon from Google Maps APIs

This forum is intended for cases when a problem can not be solved due to restrictions of the platform: a bug or lack of functionality.

#1
People who like this:0Yes/0No
Active user
Rating: 2
Joined: Jul 3, 2013
Company: TRIAX

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!

 
#2
People who like this:0Yes/0No
Administrator
Rating: 17
Joined: Dec 4, 2017
Company:

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

1C Company support team
 
#3
People who like this:0Yes/0No
Just came
Rating: 0
Joined: Mar 15, 2018
Company:

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

Instead

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

Use

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

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

 
#4
People who like this:0Yes/0No
Active user
Rating: 2
Joined: Jul 3, 2013
Company: TRIAX

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!

Edited: Hoang Minh Tri - Mar 18, 2018 09:22 PM
 
Subscribe
Be the first to know tips & tricks on business application development!

A confirmation e-mail has been sent to the e-mail address you provided .

Click the link in the e-mail to confirm and activate the subscription.