Имя: Пароль:
1C
1С v8
GET-запрос в 8.2 через WinHttp.WinHttpRequest.5.1.
, ,
0 Vlad_1717
 
23.12.19
12:41
Добрый день. коллеги. Настраиваю API с Яндекс.Доставка. Все запросы POST и PUT работают, а вот GET выдает ответ от сервера:
<html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>.

Косяк в том, что нужно в GET-запрос вставить авторизацию по токену, но ни через SetRequestHeader("Authorization", "OAuth " + token), ни через прямое указание токена в строке запроса: "?" + "OAuth=" + token
получить верный ответ не получается.

Метод в Яндекс.Доставке - "location" (определение полного адреса по строке, содержащей часть адреса).
Эти же данные, забиваемые в Postman, дают верный ответ.
1 Garykom
 
гуру
23.12.19
12:50
2 Vlad_1717
 
23.12.19
13:03
(1) Это старая версия документации. По ней я настраивал, а потом оп-ля... и всё поменяли.
Сейчас уже 3-я редакция: https://tech.yandex.ru/delivery-3/doc/dg/reference/get-location-docpage/
3 Garykom
 
гуру
23.12.19
13:57
(2) Тогда возьми cURL и проверь с ним, если все ок то это какая то трабла WinHttp.WinHttpRequest.5.1
4 Vlad_1717
 
23.12.19
15:16
(3) Честно говоря, с cURL-ом не сталкивался ранее. А вот POSTMAN запрос отрабатывает верно, а Fiddler выдает ту же ошибку, что и WinHttp.WinHttpRequest.5.1. А "трабла" означает отказ от WinHttp.WinHttpRequest.5.1? Тогда не выход....
5 Garykom
 
гуру
23.12.19
15:22
(4) Код покажи, скорее всего скосячил
6 Vlad_1717
 
23.12.19
15:28
(5) Конечно:
    WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
    WinHttp.Option(2,"utf-8");
    WinHttp.SetTimeouts(60000, 60000, 60000, 60000);
    token = "AgAAAAA1Zf1NAAXdyDRcIbXFMkuhsmB9GdSdaj0";
    WinHttp.Open("GET", "https://api.delivery.yandex.ru/location?term=(Великие Луки)", 0);
    WinHttp.setRequestHeader("Content-Type", "application/json");
    //WinHttp.SetRequestHeader("Authorization", "Token " + token);
    WinHttp.SetRequestHeader("Authorization", "OAuth " + token);
    //WinHttp.setRequestHeader("Authorization", "Bearer " + token);
    //WinHttp.setRequestHeader("Authorization", "OAuth oauth_token=" + token);
    WinHttp.Send();
    WinHttp.WaitForResponse();
    Ответ = WinHttp.ResponseText();    

Закомментированные строки - варианты авторизации. Результат тот же.
7 Garykom
 
гуру
23.12.19
15:33
(6) Гыгыгыгы
8 e053nk
 
23.12.19
15:38
Вставлю свое замечание.Может поможет.
Есть у меня сервис обмена с порталом автопроизводителя. Работает из под 8.2  обмен json файлами.Поэтому использую WinHttp.WinHttpRequest.5.1. Больше года работало все нормально (даже и не лазил в него) В ноябре встало колом. Увидел не сразу. Стал разбираться. Fiddler прогонял. На самом сайте пробный обмен -проходил отлично. Причину нашел,только изменить пока не могу. Причина -в кириллических символах в параметрах строки запроса Get. Т.е. если указать code="ЭЭ098" запрос возвращает ошибку, если указать code="098" - запрос проходит , но возвращает некорректные данные. Со службой тех.поддержки бьюсь 4 день -упорно мне доказывают, что у меня кодировка не верная. только до этого 1,5года работало без проблем, а сейчас перестала. ТАм еще есть сервисы подобные -я их сегодня тестить буду
9 e053nk
 
23.12.19
15:40
О , увидел "Великие Луки" -вот как у меня.Пробуй забабахать что то английское.Пускай пустой ответ,но должно вернуть
10 Garykom
 
гуру
23.12.19
15:40
(8) +1 кодировка кириллицы в URL
Преобразуйте согласно

WinHttp.Open("GET", "https://api.delivery.yandex.ru/location?term=(Великие%20Луки)%0A";, 0);
11 Garykom
 
гуру
23.12.19
15:41
(10) + движок форума испортиль

api.delivery.yandex.ru/location?term=(%D0%92%D0%B5%D0%BB%D0%B8%D0%BA%D0%B8%D0%B5%20%D0%9B%D1%83%D0%BA%D0%B8)%0A
12 Garykom
 
гуру
23.12.19
15:42
13 e053nk
 
23.12.19
15:43
а вот как это преобразовать? У меня этих кодов может быть десятки тысяч блин.
Кодировка стоит utf-8.
14 Garykom
 
гуру
23.12.19
15:43
15 Garykom
 
гуру
23.12.19
15:44
16 Vlad_1717
 
23.12.19
16:12
(15) Решил не заморачиваться с 2-мя словами, оставил только "Великие".
Вот такая строка в запросе: "https://api.delivery.yandex.ru/location?term=%C2%E5%EB%E8%EA%E8%E5"; (надеюсь, верно перекодировал?)
Ответ уже другой: {"message":"400: Unable to parse URI query","type":"UNKNOWN"}
Перекодировщик отсюда: (15).

А вот строка запроса из (11) отрабатывает норм!
17 e053nk
 
23.12.19
16:13
Как я понял вместо "ЭЭ098"  я должен послать подобное "%D0%92%D0%B5%D0%BB%D0%B8%D0%BA%D0%B8%D0%B5%20%D0%9B%D1....?
Вот когда это поменялось? работало какое то время и вот он нежданчик прилетел.
18 Garykom
 
гуру
23.12.19
16:20
(16) Код перекодировщика скорее всего не тот.
Тебе надо не CP1251 а вероятно UTF8 взять исходную строку Великие Луки и далее URL encoding
19 Garykom
 
гуру
23.12.19
16:23
20 Garykom
 
гуру
23.12.19
16:24
21 Vlad_1717
 
23.12.19
16:48
(20) Победил! Спасибо огромное!