Имя: Пароль:
1C
 
Как складывается HTTP адрес при вызове ВызватьHTTPМетод
0 ArturDoo
 
07.05.21
09:44
Добрый день. Нужно обратиться и получить данные от ХТТП ресурса (метод ГЕТ). Выдает то 404, то 302. Подскажите, как складывается адрес при выполнении это процедуры.
Пишу так: Ответ = Соединение.ВызватьHTTPМетод(Метод, ЗапросHTTP). Как вы можете понять из ссылок, я хочу получить контрагентов из амоCRM

ЗапросHTTP.АдресРесурса    = "/contacts/?type=json" Строка
Соединение.Сервер = "a****.amocrm.ru" Строка

Что не так?
1 ДенисЧ
 
07.05.21
09:48
А зачем через ВызватьHTTPМетод ?
Если просто HTTPСоединение.Получить("/contacts/?type=json")
?
2 ArturDoo
 
07.05.21
09:50
(1) На эту процедуру переходит ещё, когда логинюсь, а потом хочу на неё отправку (пост) завязать, чтоб лишний код не плодить
3 Kassern
 
07.05.21
09:53
(1) а чем вам не нравится данный метод? Все тоже самое Ответ=Соединение.ВызватьHTTPМетод("GET",ЗапросHTTP);
4 Kassern
 
07.05.21
09:54
(2) дело не в этом методе, дело в том что вы передается, либо куда передаете
5 ДенисЧ
 
07.05.21
09:54
(3) тем, что у ТС с ним возникли затруднения ))))
6 Kassern
 
07.05.21
09:54
(4) аунтификация нужна для этого ресурса?
7 Kassern
 
07.05.21
09:55
(5) ну потому что ошибка только на моменте отправки и возникает, тоже самое у него будет и при .Получить("/contacts/?type=json")
8 Kassern
 
07.05.21
09:56
(0) по поводу ssl не забыли?
9 ArturDoo
 
07.05.21
09:58
(4) Я думаю нет, но узнаю 100%, только когда перешагну 404))
10 Kassern
 
07.05.21
09:58
11 Kassern
 
07.05.21
10:00
Для того чтобы получить список контактов своего аккаунта надо как минимум авторизоваться, у вас я не вижу даже попытки этого сделать. Если это публичный метод без авторизации, тогда вы можете тупо в браузере вбить строку гет запроса и получить данные
12 ArturDoo
 
07.05.21
10:03
(10) (11)
Функция ИнициализацияПодключенияOAuth2(ОбновитьТокен = Ложь) Экспорт
    
    Попытка
        ПараметрыПодключения = РегистрыСведений.ns_НастройкиCRM.ПолучитьСписокНастроек();
        
        Соединение = ПолучитьHTTPСоединение(ПараметрыПодключения);
        Если Соединение = Неопределено Тогда
            Возврат ЗаписатьОшибкуВЖурналCRM("ИнициализацияПодключения", "Ошибка получения соединения для получения Code.");
        КонецЕсли;
        
        ЗапросHTTP = ЗапросHTTP_AuthorizeОAuth2(ПараметрыПодключения, ОбновитьТокен);
        
        Ответ = Соединение.ВызватьHTTPМетод("POST", ЗапросHTTP);
        ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
        ТелоЗапроса = ЗапросHTTP.ПолучитьТелоКакСтроку();
        
        ДанныеОтвета = ПрочитатьCrmJSON(ТелоОтвета);
        
        Если Ответ.КодСостояния = 200 ИЛИ Ответ.КодСостояния = 204 Тогда
            Если НЕ ЗначениеЗаполнено(ОбработатьHTTPОтветOAuth2(ДанныеОтвета, Ответ.КодСостояния, ТелоОтвета)) Тогда
                Возврат ЗаписатьОшибкуВЖурналCRM("ИнициализацияПодключения", "Ошибка запроса Авторизации." + Символы.ПС +
                    ФорматироватьJSON(ТелоОтвета) + Символы.ПС + "Запрос:" + Символы.ПС + ТелоЗапроса);    
            КонецЕсли;
        Иначе
            Если ОбновитьТокен = Ложь Тогда
                ИнициализацияПодключенияOAuth2(Истина);    
            КонецЕсли;
            Возврат ЗаписатьОшибкуВЖурналCRM("ИнициализацияПодключения", "Ошибка запроса Авторизации. Код состояния = " + Ответ.КодСостояния + Символы.ПС +
                ФорматироватьJSON(ТелоОтвета) + Символы.ПС + "Запрос:" + Символы.ПС + ТелоЗапроса);
        КонецЕсли;
        
        Cookie = Ответ.Заголовки.Получить("Set-Cookie");
        access_token = ДанныеОтвета["access_token"];
        refresh_token = ДанныеОтвета["refresh_token"];
        
        РегистрыСведений.ns_НастройкиCRM.ЗаписатьНастройку(Перечисления.ns_ВидыНастроекCRM.Cookie, Cookie, ПараметрыПодключения);
        РегистрыСведений.ns_НастройкиCRM.ЗаписатьНастройку(Перечисления.ns_ВидыНастроекCRM.AccessToken, access_token, ПараметрыПодключения);
        РегистрыСведений.ns_НастройкиCRM.ЗаписатьНастройку(Перечисления.ns_ВидыНастроекCRM.RefreshToken, refresh_token, ПараметрыПодключения);
        
    Исключение
        ЗаписатьОшибкуВЖурналCRM("ИнициализацияПодключения", ОписаниеОшибки());
    КонецПопытки;
    
    Возврат Истина;
КонецФункции
13 ArturDoo
 
07.05.21
10:03
Инициализация выполняется
14 ArturDoo
 
07.05.21
10:04
Всё проходит без ошибок и я получаю атокин и ртокин
15 Kassern
 
07.05.21
10:07
(14) а метод точно GET у вас передается? Пробовали через какую нить прогу сделать подобный запрос, например fiddler, postman?
16 ArturDoo
 
07.05.21
10:14
Пробовал через RESTED Гетом тащить, всё ок
17 ArturDoo
 
07.05.21
10:16
Подскажите, как ссылка собирается ВызватьHTTPМетод, учитывая данные из (0)
18 ArturDoo
 
07.05.21
10:17
Как я понимаю, она должна выглядеть так: a****.amocrm.ru/contacts/?type=json. Правильно?
19 Kassern
 
07.05.21
10:18
(18) Блин в вы что в метод то пихаете?))
20 Kassern
 
07.05.21
10:18
(19) В апишке же /api/v4/contacts/?type=json так?
21 Kassern
 
07.05.21
10:19
(20) попробуйте Ответ = Соединение.ВызватьHTTPМетод("GET","/api/v4/contacts/?type=json");
22 ArturDoo
 
07.05.21
10:19
(18)GET
23 Kassern
 
07.05.21
10:25
(18) зачем вы "/api/v4/" обрезаете из метода?? вот же документация https://www.amocrm.ru/developers/content/crm_platform/contacts-api#contacts-list
24 ArturDoo
 
07.05.21
10:30
//Возврат ns_Core.ОтправитьЗапросВCRM("GET", "/api/v4/contacts/", ДатаСверки);
    /////
    Возврат ns_Core.ОтправитьЗапросВCRM("GET", "/contacts/", ДатаСверки);
    ///////
Было так. Я вас и спрашиваю, как функция формирует ссылку. Убрал апи, тк выдавало 404
25 ArturDoo
 
07.05.21
10:31
(21) Второй параметр функции должен быть запрос, а не строка
26 Kassern
 
07.05.21
10:33
(24) У вас в соединении должен быть лишь адрес сервера. Грубо говоря только "www.amocrm.ru". Все что дальше, должно быть в строке запроса.
27 Kassern
 
07.05.21
10:35
(26) Сделайте так.
HTTPЗапрос=Новый HTTPЗапрос("/api/v4/contacts/?type=json",Заголовки)//Заголвки указать если нужно
Ответ=Соединение.ВызватьHTTPМетод("GET",HTTPЗапрос);
28 Kassern
 
07.05.21
10:36
(27) А в соединении в адресе сервера у вас должен быть только домен к примеру:
Соединение=Новый HTTPСоединение("www.amocrm.ru",ПортЕслиНужен,,,,,SSL);
29 Kassern
 
07.05.21
10:37
(28) ну или какой там домен для апишки вашей
30 Kassern
 
07.05.21
10:38
(27) Попробуйте еще убрать "/?type=json" из запроса. Оставьте только /api/v4/contacts
31 Kassern
 
07.05.21
10:39
(30) и где вы вообще этот параметр нашли, там же только доступные:
with     string     Данный параметр принимает строку, в том числе из нескольких значений, указанных через запятую. Данный метод поддерживает следующие параметры.
page     int     Страница выборки
limit     int     Количество возвращаемых сущностей за один запрос (Максимум – 250)
query     string|int     Поисковый запрос (Осуществляет поиск по заполненным полям сущности)
filter     object     Фильтр. Подробней про фильтры читайте в отдельной статье
order     object     Сортировка результатов списка.
Доступные поля для сортировки: updated_at, id.
Доступные значения для сортировки: asc, desc.
Пример: /api/v4/contacts?order[updated_at]=asc
32 Kassern
 
07.05.21
10:40
(31) Тип данных который вы хотите получить передается скорее всего тут в заголовках
33 Kassern
 
07.05.21
10:41
(32) можно попробовать указать
Заголовки=Новый соответсвие();
Заголовки.Вставить("Content-type", "application/json");
34 ArturDoo
 
07.05.21
10:42
(27)
Ошибка запроса Авторизации. Код состояния = 404
{
    "detail": "Cannot GET https://a*****.amocrm.ru/contacts/?type=json!",
    "status": 404,
    "type": "https://httpstatus.es/404",
    "title": "Not Found"
}
Тоже, что было при:
//Возврат ns_Core.ОтправитьЗапросВCRM("GET", "/api/v4/contacts/", ДатаСверки);
35 Kassern
 
07.05.21
10:43
(34) уберите ?type=json!",
36 Kassern
 
07.05.21
10:45
(35) В общем как то так попробуйте:
Соединение=Новый HTTPСоединение("www.amocrm.ru(либо какой там у вас домен апи)",,,,,,SSL);

Заголовки=Новый соответсвие();
Заголовки.Вставить("Content-type", "application/json");
HTTPЗапрос=Новый HTTPЗапрос("/api/v4/contacts",Заголовки);//Заголвки указать если нужно
Ответ=Соединение.ВызватьHTTPМетод("GET",HTTPЗапрос);
37 Kassern
 
07.05.21
10:48
(36) ну и про авторизацию не забывать, я соединение написал с доменом, чтобы понятно было, что туда передавать, не нужно в соединение пихать www.amocrm.ru/api/v4 и тому подобное
38 ArturDoo
 
07.05.21
11:07
Дошёл до 401) Спасибо большое. Не проконсультируете насчет авторизации? В соединение предаю пароль, логин, но кидает в ответ 401. Что ему ещё надо?
39 Kassern
 
07.05.21
11:20
(38) я так понял ты получил токен нужный. А дальше тебе нужно его передавать в заголовках. Например:
Заголовки.Вставить("Authorization: Bearer", access_token);
40 Kassern
 
07.05.21
11:21
(39) главное следить за сроком жизни (писать в какой нить РС), Если истекает, то получать новый. Можно рег заданием сделать
41 Kassern
 
07.05.21
11:21
(40) либо при запросе, проверять срок жизни, если истек, получать новый
42 ArturDoo
 
07.05.21
12:38
(41) Сделал так, опять где-то ошибся?
AccessToken = Новый Соответствие;
AccessToken.Вставить("Authorization: Bearer", ЗначениеAccessToken);
HTTPЗапрос=Новый HTTPЗапрос("/api/v4/contacts",AccessToken);
Ответ=Соединение.ВызватьHTTPМетод("GET",HTTPЗапрос);
43 Kassern
 
07.05.21
12:39
(42) Токен верный получен? У него срок жизни есть, он актуальный?
44 Kassern
 
07.05.21
12:40
(42) сейчас вроде все верно написано, главное чтобы токен был верный в значении заголовка
45 Kassern
 
07.05.21
12:41
(42) и лучше не называть заголовки AccessToken. Так как помимо токена туда можно много чего передавать. Например контент тип и т.д.
46 Kassern
 
07.05.21
12:42
(45) но это вкусовщина, в любом случае все должно работать, если токен верный
47 arsik
 
гуру
07.05.21
12:43
(42) Может соединение нужно сначала сбросить?
48 ArturDoo
 
07.05.21
12:48
Токен точно верный, перед тестом получил новый. Точно всё правильно передаю?
49 arsik
 
гуру
07.05.21
12:50
(48) ВОт так надо

AccessToken = Новый Соответствие;
AccessToken.Вставить("Authorization","Bearer "+ЗначениеAccessToken);
50 arsik
 
гуру
07.05.21
12:56
+ (49) Вот же пример готовый https://i.imgur.com/6vj5boG.png
Соответствие при запросе превратится в "Ключ:Значение"
51 Kassern
 
07.05.21
13:10
(50) блин точно, я не так копирнул ему ключ))
52 ArturDoo
 
07.05.21
13:48
(49) (50) (51) Спасибо большое, так работает))
53 arsik
 
гуру
07.05.21
14:12
(52) На будущее, для отладки таких вещей нужно fiddler-ом воспользоватся ну или https://httpbin.org/.
Например запрос на https://httpbin.org/get вернет в ответе твой запрос с заголовками и прочим.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой