Вход | Регистрация
 

Как складывается HTTP адрес при вызове ВызватьHTTPМетод

Как складывается HTTP адрес при вызове ВызватьHTTPМетод
Я
   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")
?
   ArturDoo
 
2 - 07.05.21 - 09:50
(1) На эту процедуру переходит ещё, когда логинюсь, а потом хочу на неё отправку (пост) завязать, чтоб лишний код не плодить
   Kassern
 
3 - 07.05.21 - 09:53
(1) а чем вам не нравится данный метод? Все тоже самое Ответ=Соединение.ВызватьHTTPМетод("GET",ЗапросHTTP);
   Kassern
 
4 - 07.05.21 - 09:54
(2) дело не в этом методе, дело в том что вы передается, либо куда передаете
   ДенисЧ
 
5 - 07.05.21 - 09:54
(3) тем, что у ТС с ним возникли затруднения ))))
   Kassern
 
6 - 07.05.21 - 09:54
(4) аунтификация нужна для этого ресурса?
   Kassern
 
7 - 07.05.21 - 09:55
(5) ну потому что ошибка только на моменте отправки и возникает, тоже самое у него будет и при .Получить("/contacts/?type=json")
   Kassern
 
8 - 07.05.21 - 09:56
(0) по поводу ssl не забыли?
   ArturDoo
 
9 - 07.05.21 - 09:58
(4) Я думаю нет, но узнаю 100%, только когда перешагну 404))
   Kassern
 
10 - 07.05.21 - 09:58
   Kassern
 
11 - 07.05.21 - 10:00
Для того чтобы получить список контактов своего аккаунта надо как минимум авторизоваться, у вас я не вижу даже попытки этого сделать. Если это публичный метод без авторизации, тогда вы можете тупо в браузере вбить строку гет запроса и получить данные
   ArturDoo
 
12 - 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("ИнициализацияПодключения", ОписаниеОшибки());
    КонецПопытки;
    
    Возврат Истина;
КонецФункции
   ArturDoo
 
13 - 07.05.21 - 10:03
Инициализация выполняется
   ArturDoo
 
14 - 07.05.21 - 10:04
Всё проходит без ошибок и я получаю атокин и ртокин
   Kassern
 
15 - 07.05.21 - 10:07
(14) а метод точно GET у вас передается? Пробовали через какую нить прогу сделать подобный запрос, например fiddler, postman?
   ArturDoo
 
16 - 07.05.21 - 10:14
Пробовал через RESTED Гетом тащить, всё ок
   ArturDoo
 
17 - 07.05.21 - 10:16
Подскажите, как ссылка собирается ВызватьHTTPМетод, учитывая данные из (0)
   ArturDoo
 
18 - 07.05.21 - 10:17
Как я понимаю, она должна выглядеть так: a****.amocrm.ru/contacts/?type=json. Правильно?
   Kassern
 
19 - 07.05.21 - 10:18
(18) Блин в вы что в метод то пихаете?))
   Kassern
 
20 - 07.05.21 - 10:18
(19) В апишке же /api/v4/contacts/?type=json так?
   Kassern
 
21 - 07.05.21 - 10:19
(20) попробуйте Ответ = Соединение.ВызватьHTTPМетод("GET","/api/v4/contacts/?type=json");
   ArturDoo
 
22 - 07.05.21 - 10:19
(18)GET
   Kassern
 
23 - 07.05.21 - 10:25
(18) зачем вы "/api/v4/" обрезаете из метода?? вот же документация https://www.amocrm.ru/developers/content/crm_platform/contacts-api#contacts-list
   ArturDoo
 
24 - 07.05.21 - 10:30
//Возврат ns_Core.ОтправитьЗапросВCRM("GET", "/api/v4/contacts/", ДатаСверки); 

    ///// 

    Возврат ns_Core.ОтправитьЗапросВCRM("GET", "/contacts/", ДатаСверки); 
    ///////

Было так. Я вас и спрашиваю, как функция формирует ссылку. Убрал апи, тк выдавало 404
   ArturDoo
 
25 - 07.05.21 - 10:31
(21) Второй параметр функции должен быть запрос, а не строка
   Kassern
 
26 - 07.05.21 - 10:33
(24) У вас в соединении должен быть лишь адрес сервера. Грубо говоря только "www.amocrm.ru". Все что дальше, должно быть в строке запроса.
   Kassern
 
27 - 07.05.21 - 10:35
(26) Сделайте так.
HTTPЗапрос=Новый HTTPЗапрос("/api/v4/contacts/?type=json",Заголовки//Заголвки указать если нужно

Ответ=Соединение.ВызватьHTTPМетод("GET",HTTPЗапрос);
   Kassern
 
28 - 07.05.21 - 10:36
(27) А в соединении в адресе сервера у вас должен быть только домен к примеру:
Соединение=Новый HTTPСоединение("www.amocrm.ru",ПортЕслиНужен,,,,,SSL);
   Kassern
 
29 - 07.05.21 - 10:37
(28) ну или какой там домен для апишки вашей
   Kassern
 
30 - 07.05.21 - 10:38
(27) Попробуйте еще убрать "/?type=json" из запроса. Оставьте только /api/v4/contacts
 
 
   Kassern
 
31 - 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
   Kassern
 
32 - 07.05.21 - 10:40
(31) Тип данных который вы хотите получить передается скорее всего тут в заголовках
   Kassern
 
33 - 07.05.21 - 10:41
(32) можно попробовать указать 
Заголовки=Новый соответсвие();
Заголовки.Вставить("Content-type", "application/json");
   ArturDoo
 
34 - 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/", ДатаСверки);
   Kassern
 
35 - 07.05.21 - 10:43
(34) уберите ?type=json!",
   Kassern
 
36 - 07.05.21 - 10:45
(35) В общем как то так попробуйте:
Соединение=Новый HTTPСоединение("www.amocrm.ru(либо какой там у вас домен апи)",,,,,,SSL);

Заголовки=Новый соответсвие();
Заголовки.Вставить("Content-type", "application/json");
HTTPЗапрос=Новый HTTPЗапрос("/api/v4/contacts",Заголовки)//Заголвки указать если нужно

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


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.