Имя: Пароль:
1C
1С v8
Не взлетает http соединение
,
0 Timur2019
 
14.08.19
14:35
Привет всем. Пытаюсь подружить 1с УТ 11 с сайтом по api. Код такой :

     HTTPСоединение =  Новый HTTPСоединение("xn----7sbgfs5baxh7jc.xn--p1ai",80);     
    
     ТекстЗапроса = "http://xn----7sbgfs5baxh7jc.xn--p1ai/SearchService/GetBrands?article={1004110004}&withoutTransit={true}";;    
    
     HTTPЗапрос = Новый HTTPЗапрос(ТекстЗапроса);
    
     //Login + ":" +Password
    
     СтрокаАвторизации = СокрЛП(Объект.Логин) + ":" + СокрЛП(Объект.Пароль);    
    
     // на входе вот такая строка : "НашЛогин:НашПароль"
    
     СтрокаАвторизацииBASE64 = ПолучитьСтрокуBase64(СтрокаАвторизации);
    
     // на выходе строка в base64: 77u/YW1pcm92c3VyZW5AcmFtYmxlci5ydTpPc3JhbTY3Mg==
    
     HTTPЗапрос.Заголовки.Вставить("Authorization", "Basic "+СтрокаАвторизацииBASE64);
     HTTPЗапрос.Заголовки.Вставить("Accept", "application/json");
     HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");
         HTTPЗапрос.Заголовки.Вставить("Host", "xn----7sbgfs5baxh7jc.xn--p1ai/");

         Ответ = HTTPСоединение.Получить(HTTPЗапрос);  

     Сообщить("Код результата: " + Ответ.КодСостояния);    
    
     ОтветJSON = Ответ.ПолучитьТелоКакСтроку("UTF-8") ;         
    
     Сообщить("Ответ: " + ОтветJSON);

    В ответе приходит код ошибки 400 - Bad Request :- очевидно неправильный синтаксис запроса.
    Строка запроса из документации такая : http://xn----7sbgfs5baxh7jc.xn--p1ai/SearchService/GetBrands?article={article}&withoutTransit=={true/false}  
  
    Что я делаю не так ?
1 Garykom
 
гуру
14.08.19
14:43
1. Если начать читать мануалы то
2. ТекстЗапроса = "/SearchService/GetBrands?article={1004110004}&withoutTransit={true}"
2 ГдеСобака Зарыта
 
14.08.19
14:44
"Что я делаю не так?" Ты гуглом не пользуешься, обязательно нужно гуглить, прежде чем писать на форум
Обмен между базами через http-сервис - КодСостояния = 403
3 Timur2019
 
14.08.19
14:48
Спасибо :)
4 Timur2019
 
14.08.19
15:05
Не -  тоже самое , сделал так :

  HTTPСоединение =  Новый HTTPСоединение("xn----7sbgfs5baxh7jc.xnp1ai",80);     
  ТекстЗапроса = "/SearchService/GetBrands?article={1004110004}&withoutTransit=={true}" ;      
  HTTPЗапрос = Новый HTTPЗапрос(ТекстЗапроса);

  Та - же  ошибка.
5 Timur2019
 
14.08.19
15:23
up
6 Timur2019
 
14.08.19
15:34
В итоге код выглядит вот так :    
Но не взлетает.
    
         HTTPСоединение =  Новый HTTPСоединение("xn----7sbgfs5baxh7jc.xn--p1ai",80);     
    
     ТекстЗапроса = "/SearchService/GetBrands?article={1004110004}&withoutTransit={true}";
    
     HTTPЗапрос = Новый HTTPЗапрос(ТекстЗапроса);
    
     //Login + ":" +Password
    
     СтрокаАвторизации = СокрЛП(Объект.Логин) + ":" + СокрЛП(Объект.Пароль);    
    
     // на входе вот такая строка : "НашЛогин:НашПароль"
    
     СтрокаАвторизацииBASE64 = ПолучитьСтрокуBase64(СтрокаАвторизации);
    
     // на выходе строка в base64: 77u/YW1pcm92c3VyZW5AcmFtYmxlci5ydTpPc3JhbTY3Mg==
    
     HTTPЗапрос.Заголовки.Вставить("Authorization", "Basic "+СтрокаАвторизацииBASE64);
     HTTPЗапрос.Заголовки.Вставить("Accept", "application/json");
     HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");
         HTTPЗапрос.Заголовки.Вставить("Host", "xn----7sbgfs5baxh7jc.xn--p1ai/");

         Ответ = HTTPСоединение.Получить(HTTPЗапрос);  

     Сообщить("Код результата: " + Ответ.КодСостояния);    
    
     ОтветJSON = Ответ.ПолучитьТелоКакСтроку("UTF-8");         
    
     Сообщить("Ответ: " + ОтветJSON);
    
     Сообщить ("текст запроса :" + ТекстЗапроса);
7 Garykom
 
гуру
14.08.19
15:38
Вот эти "{" и "}" выглядят очень странно, без них попробуй.
А лучше мануала в студию
8 Garykom
 
гуру
14.08.19
15:41
"Доступ к функциям сервиса ограничен как технически, так финансово и административно. Для получения доступа вам необходимо сообщить следующие данные:

детальную информацию о конкретной компании, которая будет использовать сервис. Имеется ввиду вся юридическая информация.
логин пользователя на сайте, под которым будут осуществляться запросы.
адрес страницы WEB-сайта или имя программы, с которой будут использоваться запросы к функциям сервиса.
IP-адрес, с которого будет осуществляться доступ"

могут блочить по ip
9 Timur2019
 
14.08.19
15:43
(8) все разрешено IP пингуется.
10 Timur2019
 
14.08.19
15:46
Мануал :

HTTP метод
    
GET

URL запроса
    

http://xn----7sbgfs5baxh7jc.xn--p1ai/SearchService/GetBrands?article={article}&withoutTransit=={true/false}

Заголовки запроса (request headers)
    

Authorization: Basic {credentials}
Accept: application/json
Content-type: application/json
Host: xn----7sbgfs5baxh7jc.xn--p1ai/

Параметры запроса

(Все параметры обязательные!)
    

article – Артикул (тип string)

withoutTransit – Не возвращать транзитных поставщиков (тип Bool)

Ответ
    

Строка JSON, коллекция объектов следующей структуры:

"Article": "333305"
    

Артикул детали
    

String

"Brand": "KYB"
    

Производитель (бренд)
    

String

"Description": "Амортизатор
    

Описание детали
    

String

//---------------------
Важно! домен сайта http://автосоюз-юг.рф/ должен быть написан в punycode: http://xn----7sbgfs5baxh7jc.xn--p1ai/
//----------------------

Запросы осуществляется с помощью HTTP-методов GET

Для запросов требуется преобразовать ваш логин и пароль вида «Login:Password» в формат Base64

В итоге строка авторизации должна иметь вид:

Пример кода на C#:

return "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(Login + ":" +Password));
11 Timur2019
 
14.08.19
15:50
12 Timur2019
 
14.08.19
15:52
Интересно что так :  
ТекстЗапроса = "/";    
та же ошибка ... :)
13 bootini
 
14.08.19
16:01
(0) В ТекстЗапроса http:.... не надо, оно в соединении указывается.

ТекстЗапроса = "/SearchService/GetBrands?article={article}&withoutTransit=={true/false}"
14 bootini
 
14.08.19
16:03
(13) а в место  article должно быть значение, т.е. правильный текст запроса должен выглядеть как-то так:

ТекстЗапроса = "/SearchService/GetBrands?article=01235485&withoutTransit==false"
15 Timur2019
 
14.08.19
16:04
(13)
Сейчас так : - тот же результат :)
ТекстЗапроса = "/SearchService/GetBrands?article={1004110004}&withoutTransit={true}";
16 bootini
 
14.08.19
16:09
скобки не нужны "/SearchService/GetBrands?article=1004110004}&withoutTransit=true"
17 bootini
 
14.08.19
16:09
(16) так: /SearchService/GetBrands?article=1004110004&withoutTransit=true
18 Garykom
 
гуру
14.08.19
16:09
(15) забыл одну скобку
19 Garykom
 
гуру
14.08.19
16:10
Короче http это такое веселое там все зависит от опыта кто поднимал и кто пишет коннект.
И качества документации и примеров.
20 bootini
 
14.08.19
16:11
(17) работает, я в адресную строку вбил, мне вернуло "Login and Password are wrong"
21 Timur2019
 
14.08.19
16:16
(20) да из браузера работает из 1с пока то-же самое.... щас буду посмотреть
22 Timur2019
 
14.08.19
16:24
Из 1с :

Код результата: 400
Ответ: <html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.10.3</center>
</body>
</html>
текст запроса :/SearchService/GetBrands?article=1004110004&withoutTransit=true
23 Timur2019
 
14.08.19
16:25
Значит строка запроса правильная - дело в аутентификации поидее
24 Garykom
 
гуру
14.08.19
16:27
Логин с паролем в какой кодировке перед тем как в Base64 ?

Если дятел сервер делал то там может быть и Windows-1251 и UTF-8 и что угодно
25 Garykom
 
гуру
14.08.19
16:27
ну или логин/пароль лучше только латиница
26 bootini
 
14.08.19
16:29
СтрокаАвторизацииДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(СтрокаАвторизации, КодировкаТекста.UTF8, Ложь);
СтрокаАвторизацииBASE64 = Base64Строка(СтрокаАвторизацииДвоичныеДанные);
27 Garykom
 
гуру
14.08.19
16:29
(22) "400 Bad Request" это именно плохой запрос проверяй через Postman или через curl
28 bootini
 
14.08.19
16:30
(27) и скорее всего с заголовками что-то
29 Timur2019
 
14.08.19
16:42
24) В мануале есть такое :

Для запросов требуется преобразовать ваш логин и пароль вида «Login:Password» в формат Base64

В итоге строка авторизации должна иметь вид:

Пример кода на C#:
return "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(Login + ":" +Password));

как я понимаю сначала строку в UTF 8 а потом в Base64...

Да так локоничнее чем было...
СтрокаАвторизацииДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(СтрокаАвторизации, КодировкаТекста.UTF8, Ложь);
СтрокаАвторизацииBASE64 = Base64Строка(СтрокаАвторизацииДвоичныеДанные);
30 Timur2019
 
14.08.19
16:42
но пока не взлетел...
31 bootini
 
14.08.19
16:49
Fiddler еще можешь поставить, он перехватывает запрос и ответ, там можно посмотреть где конкретно ошибка
32 Timur2019
 
14.08.19
16:52
(31)ок спасибо :)