Имя: Пароль:
1C
 
При получении данных с сайта получаю 301 ошибку
0 asder117
 
24.11.21
15:45
Доброго времени суток. имеем на борту УПП 1.3. Руководство решило делать интеграцию с сайтом откуда получать данные по апи
Постман на такую конструкцию дает json ответ http://www.domain.com/api/v2/fam/?categories=253&language=ru
При попытке реализовать это в коде вылетает 301 код как это решить не пойму. Пробовал разными способами все равно 301 код.
Спасибо на подсказку
12 asder117
 
24.11.21
15:52
(10)   HTTPЗапрос = Новый HTTPЗапрос("/api/v2/families"); типа такого?
13 fisher
 
24.11.21
15:52
(9) Если есть что сказать - не держи в себе.
14 asder117
 
24.11.21
15:54
(11) поправил но все равно 301 код location в ответе https://www.domain.com/api/v2/families
15 Garykom
 
гуру
24.11.21
16:02
(13) в свое время пришлось эту недолибу допиливать
так что я все сказал
16 Garykom
 
гуру
24.11.21
16:02
(14) ну так посмотри что в ответе
17 Garykom
 
гуру
24.11.21
16:03
и код уже покажи весь
18 Garykom
 
гуру
24.11.21
16:03
(17)+ имхо ошибся где то
19 eklmn
 
гуру
24.11.21
16:07
(17) так не интересно... телепата развивай!
20 fisher
 
24.11.21
16:08
(15) Хотя бы в комментариях на инфостарте тогда отписался о найденных тобой проблемах, раз уж пул реквест было лень делать. Вот таким бы мы тебя любили, вот таким бы мы тебя хвалили.
21 Garykom
 
гуру
24.11.21
16:10
(20) нахер
слишком много недолиб разных, в каждой отписываться бесплатно не готов
22 pechkin
 
24.11.21
16:10
ну так www добавь
23 Garykom
 
гуру
24.11.21
16:11
(22) и такой прикол может быть да
криво записи настроили
24 asder117
 
24.11.21
16:29
(10) Коллега а по моему вопросу что лучше сделать? спасибо
25 Ёпрст
 
24.11.21
17:46
(24) польше кода
26 Ёпрст
 
24.11.21
17:46
* больше
27 asder117
 
24.11.21
23:02
(25) да хоть листинг нишиша не выходит
28 Ёпрст
 
24.11.21
23:30
(27) нам отсюда не видно, что ты там творишь
Больше кода.
29 ДедМорроз
 
25.11.21
09:40
Если в редиректе передан url отличный от запрашиваемого,то идем по нему,отдельно,желательно,все пройденные класть в массив,чтобы при циклических редиректах не было проблем или ограничивать их применение каким-то количеством,как делает браузер.

Что сложного ?
30 eklmn
 
гуру
25.11.21
09:44
(29) "Что сложного ?" - понимание...
31 ДедМорроз
 
25.11.21
09:56
Если нет понимания,то знакомство с библиотекой еще более деструктивно пройдет.
32 asder117
 
25.11.21
10:31
(26)     ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.ПроверятьСтруктуру = Ложь;
    ЗаписьJSON.УстановитьСтроку();
    СтруктураЗапроса = Новый Структура;
    СтруктураЗапроса.Вставить("categories__id","253");
    СтруктураЗапроса.Вставить("language","ru");
    
    ЗаписатьJSON(ЗаписьJSON,СтруктураЗапроса);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    HTTPСоединение = Новый HTTPСоединение(URL,443, , , , , Новый ЗащищенноеСоединениеOpenSSL);
    HTTPЗапрос = Новый HTTPЗапрос("/api/v2/families");
    HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    Сообщить(""+HTTPОтвет.КодСостояния+" "+HTTPОтвет.ПолучитьТелоКакСтроку());
    Если HTTPОтвет.КодСостояния = 301 тогда
         НовыйАдрес = HTTPОтвет.Заголовки.Получить("Location");
         ПолучитьДанныеСветовыНаСервере(Лев(НовыйАдрес,25));
    КонецЕсли;    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
    Структура = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();

URL в начале приходит "domain.com"
33 asder117
 
25.11.21
10:34
(32) при этом постман http://www.domain.com/api/v2/families/?categories__id=253&language=ru отрабатывает как надо
34 asder117
 
25.11.21
10:35
(33) "domain.com" это не реальное имя сайта..свой ресурс
35 Garykom
 
гуру
25.11.21
10:48
(32) >HTTPСоединение = Новый HTTPСоединение(URL,443, , , , , Новый ЗащищенноеСоединениеOpenSSL);

убери порт 443
писал же тебе
36 Garykom
 
гуру
25.11.21
10:48
(35) просто
HTTPСоединение = Новый HTTPСоединение(URL, , , , , , Новый ЗащищенноеСоединениеOpenSSL);
37 Garykom
 
гуру
25.11.21
10:49
SSL/TLS которое HTTPS (обычно по умолчанию 443 порт) может быть на любом порту даже на обычном 80 где обычно просто HTTP
38 Garykom
 
гуру
25.11.21
10:55
(33) и да
>при этом постман http://www.domain.com/api/v2/families/?categories__id=253&language=ru отрабатывает как надо

это у тебя GET или POST?
"?categories__id=253&language=ru" - это json в теле или параметры в url?
39 Garykom
 
гуру
25.11.21
10:56
Короче или попроси рабочий пример под 1С
Или разберись уже сам со всеми технологиями чтобы в них не путаться
Или найми спеца за денежку
40 fisher
 
25.11.21
10:57
(33) В подобных случаях (постман отрабатывает как надо) ставишь fiddler и играешь в "найди 20 отличий".
41 fisher
 
25.11.21
11:01
Хотя если там в самом деле редирект, то вероятно постман его разруливает. Можно попробовать посмотреть в инструментах отладки браузера.
42 Ёпрст
 
25.11.21
11:46
(33) ну и где ты ?categories__id=253&language=ru задал ?
Правильно, нигде
43 Ёпрст
 
25.11.21
11:47
после получения редиректа, ты должен вот сюда запихать:

HTTPЗапрос = Новый HTTPЗапрос("/api/v2/families?categories__id=253&language=ru");

фирштейн ?
44 Ёпрст
 
25.11.21
11:48
ну там, синтаксис со слешами поправь тока..
45 eklmn
 
гуру
25.11.21
13:19
"ПолучитьДанныеСветовыНаСервере"
интересно что там происходит....
46 fisher
 
25.11.21
13:22
(45) Очевидно, вызываются всякие "ВопросСветовомуМужуНаСервере()"
47 Ryzeman
 
25.11.21
13:26
(32) У тебя тут POST-запрос (33) А тут GET. Причём в первом случае ты вставляешь JSON в тело, а во втором (через браузер, очевидно) - пишешь свои отборы в параметры запроса...
48 Ryzeman
 
25.11.21
13:28
(32) не обязательно код через сообщения выводить. Можно ставить точку останова и во время отладки просмотреть целиком и твой запрос и ответ. Увидишь заодно что там в теле, что в заголовках...
49 Ryzeman
 
25.11.21
13:29
(33) http или https? У тебя не указан порт, по идее тогда должен на 80-ый ломиться и это не защищённое соединение...
50 asder117
 
25.11.21
13:57
(38) get
51 asder117
 
25.11.21
13:58
(38) ""?categories__id=253&language=ru" - это json в теле или параметры в url?" - параметры в url
52 asder117
 
25.11.21
13:59
(48) Я так и делаю
53 asder117
 
25.11.21
13:59
(49) постман через http
54 Ёпрст
 
25.11.21
14:13
(51) где это в коде у тебя ?
55 asder117
 
25.11.21
14:18
(54) в теле
СтруктураЗапроса = Новый Структура;
    СтруктураЗапроса.Вставить("categories__id","253");
    СтруктураЗапроса.Вставить("language","ru");
    
    ЗаписатьJSON(ЗаписьJSON,СтруктураЗапроса);
56 Kassern
 
25.11.21
14:21
(55) попробуйте вытащить это дело из тела и впихнуть в урл. У вас ГЕТ или ПОСТ запрос? Скорее всего ГЕТ, попробуйте явно вызвать без тела, просто строчку урл явно через Ответ=Соединение.ВызватьМетод("GET",Запрос);
57 Garykom
 
гуру
25.11.21
14:22
(50) а вот
HTTPСоединение.ОтправитьДляОбработки
это POST
58 Kassern
 
25.11.21
14:23
(57) мало того, что юзает метод ПОСТ, так еще и в теле параметры передает для ГЕТ...
59 Ryzeman
 
25.11.21
14:26
HTTPСоединение = Новый HTTPСоединение(www.domain.com);
HTTPЗапрос = Новый HTTPЗапрос("/api/v2/families/?categories__id=253&language=ru");
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);

Проверяй, потом сам раскидаешь как надо.
60 Ryzeman
 
25.11.21
14:27
(59)+ URL в кавычках, разумеется
61 Kassern
 
25.11.21
14:28
(59) и ssl в соединении, если это https
62 Ryzeman
 
25.11.21
14:29
(61) он вроде писал что в постмане он по HTTP стучался и там всё ок
63 Kassern
 
25.11.21
14:36
(60) еще может надо без www писать, просто "domain.com"
64 Garykom
 
гуру
25.11.21
14:41
(58) любой запрос в т.ч. GET имеет тело
и туда можно засунуть параметры (хотя логичней в заголовки)\
другой вопрос что не любой софт может засунуть и не любой понять-вытащить засунутые
1С может кстати
65 asder117
 
25.11.21
14:41
(59) кодСостояния 301
66 Ryzeman
 
25.11.21
14:42
(65) так а в заголовках что? Location что пишет?
67 Garykom
 
гуру
25.11.21
14:42
(65) покажи уже тело ответа при этом 301
и все заголовки
68 Kassern
 
25.11.21
14:42
(64) в большинстве своем для гет запросов тело не нужно. Все передается в заголовках
69 Garykom
 
гуру
25.11.21
14:43
(68) это просто так общепринято
не значит что нельзя
70 Kassern
 
25.11.21
14:45
(65) пробовали без www?
71 asder117
 
25.11.21
14:45
(70) да
72 Garykom
 
гуру
25.11.21
14:46
http по сути сделан по аналогии с html

title
header
body

ну и добавили сверху методы, причем только "В версии HTTP 0.9 использовался только метод GET"

Метод HTTP (англ. HTTP Method) — последовательность из любых символов, кроме управляющих и разделителей, указывающая на основную операцию над ресурсом. Обычно метод представляет собой короткое английское слово, записанное заглавными буквами. Обратите внимание, что название метода чувствительно к регистру.

Сервер может использовать любые методы, не существует обязательных методов для сервера или клиента. Если сервер не распознал указанный клиентом метод, то он должен вернуть статус 501 (Not Implemented). Если серверу метод известен, но он неприменим к конкретному ресурсу, то возвращается сообщение с кодом 405 (Method Not Allowed). В обоих случаях серверу следует включить в сообщение ответа заголовок Allow со списком поддерживаемых методов.

Кроме методов GET и HEAD, часто применяется метод POST.
73 asder117
 
25.11.21
14:48
(67) <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">¶<html><head>¶<title>301 Moved Permanently</title>¶</head><body>¶<h1>Moved Permanently</h1>¶<p>The document has moved <a href="https://www.domain.com/api/v2/families/?categories__id=253&language=ru">here</a>.</p>¶</body></html>¶
74 Kassern
 
25.11.21
14:48
(62) ну да, а вот тут (73) https://www.domain.com
75 asder117
 
25.11.21
14:49
76 Garykom
 
гуру
25.11.21
14:51
(73) сделай уже

URL = "www.domain.com";
HTTPСоединение = Новый HTTPСоединение(URL, , , , , , Новый ЗащищенноеСоединениеOpenSSL);
HTTPЗапрос = Новый HTTPЗапрос("/api/v2/families/?categories__id=253&language=ru");
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Сообщить(""+HTTPОтвет.КодСостояния+" "+HTTPОтвет.ПолучитьТелоКакСтроку());
77 Garykom
 
гуру
25.11.21
14:52
(76) еще можно попробовать принудительно https на 80 порту
HTTPСоединение = Новый HTTPСоединение(URL, 80, , , , , Новый ЗащищенноеСоединениеOpenSSL);
78 Ryzeman
 
25.11.21
14:52
(75) теперь меняй первую строчку на защищённое соединение как написано в (76)  :)
79 asder117
 
25.11.21
14:53
(74) HTTPСоединение = Новый HTTPСоединение("ltcompany.com");
HTTPЗапрос = Новый HTTPЗапрос("/api/v2/families/?categories__id=253&language=ru");
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 301 Тогда
     НовыйАдрес = HTTPОтвет.Заголовки.Получить("Location");
     НовыйАдрес1 = (Лев(НовыйАдрес,25));
HTTPСоединение = Новый HTTPСоединение(НовыйАдрес1,,,,,,Новый ЗащищенноеСоединениеOpenSSL());
HTTPЗапрос = Новый HTTPЗапрос("/api/v2/families/?categories__id=253&language=ru");
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
а=0;
    КонецЕсли;
а=0;
Так сделал и ничего
80 asder117
 
25.11.21
14:54
(76) 500 <html>
  <head>
    <title>Internal Server Error</title>
  </head>
  <body>
    <h1><p>Internal Server Error</p></h1>
    
  </body>
</html>
теперь новенькое
81 Garykom
 
гуру
25.11.21
14:54
"categories__id" точно с двумя "_"
82 Garykom
 
гуру
25.11.21
14:55
(81)+ ?
83 asder117
 
25.11.21
14:56
(81) да
84 Garykom
 
гуру
25.11.21
14:56
(79) >НовыйАдрес1 = (Лев(НовыйАдрес,25));


ты понимаешь что это пипец?
потому что "https://www.domain.com/api/v2/families/?categories__id=253&language=ru" это в location
и там будет левое "https://"
85 asder117
 
25.11.21
14:58
(84) в смысле левое?
86 Kassern
 
25.11.21
14:58
такая же ошибка... https://yadi.sk/i/soFtvrKpyKRKyg
87 asder117
 
25.11.21
14:58
(77) вообще завис
88 asder117
 
25.11.21
14:59
(86) а через постман все норм
89 Kassern
 
25.11.21
14:59
(88) скрин постмана с настройками скиньте
90 Garykom
 
гуру
25.11.21
15:00
(85) HTTPСоединение = Новый HTTPСоединение("ltcompany.com"); // правильно

а вот
HTTPСоединение = Новый HTTPСоединение("https://www.ltcompany.com"); // не правильно для 1С

1С сама добавляет http или https в зависимости есть или нет ,Новый ЗащищенноеСоединениеOpenSSL()
91 Kassern
 
25.11.21
15:03
тот кто писал апишку для сайта, уточните у него следующие вопросы:
1) защищенное ли соединение
2) какой порт
3) какой метод получения данных
4) какие заголовки нужны для запроса (тот же content type, в том числе и аунтификация)
5) работает на внешку, или только во внутреннем контуре
6) какие параметры обязательны для конкретного запроса и где их указывать (в урл, или в теле)
92 asder117
 
25.11.21
15:03
93 asder117
 
25.11.21
15:04
(91) попробуем
94 Kassern
 
25.11.21
15:05
(92) у меня с этого сайта не работают скрины. Можете через https://ru.imgbb.com/ закинуть ссылку или через яндекс/гугл диск ссылку
95 Garykom
 
гуру
25.11.21
15:11
(92) еще не только Params а еще Headers покажи
96 Garykom
 
гуру
25.11.21
15:11
(95) там 6 чего то
97 Garykom
 
гуру
25.11.21
15:14
(80) вероятно чего то не хватает

т.е. код (76) правильный но надо дозаполнить Заголовки
98 asder117
 
25.11.21
16:45
99 asder117
 
25.11.21
16:46
(96) пустые поля
100 asder117
 
25.11.21
16:54
101 Kassern
 
25.11.21
17:25
(100) если вы зайдете на вкладку настроек в постмане и отключите опцию Automatically follow redirects то получите точно такую же ошибку, как в 1с
102 Kassern
 
25.11.21
17:34
скорее всего у вас https соединение. При попытке незащищенного соединения http вас редиректит на https ссылку. А вот ее вы не можете открыть, потому что настройки безопасности сайта не дают доступа к данному ресурсу. А для сервера постпана скорее всего сделано исключение.
103 Kassern
 
25.11.21
17:35
по идее у вас это обычный гет запрос без какой либо аунтификации. Видимо защиту апи сделали на уровне ssl сертификатов
104 Garykom
 
гуру
25.11.21
17:44
(98) не пустые а "6 hidden"
тыкни на глазок
105 Kassern
 
25.11.21
18:03
попытался через постман вашу строчку запроса повторить, мне пустой ответ приходит со статусом 200.
106 asder117
 
25.11.21
22:29
(101) ага в точку
107 asder117
 
26.11.21
08:44
(104) Request Headers
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: aedfbd3c-ca3c-4294-92e3-3f3da7ab9a3b
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: http://www.ltcompany.com/api/v2/families/?middle_categories__id=253&language=ru
Host: www.ltcompany.com
Response Headers
Date: Thu, 25 Nov 2021 19:50:55 GMT
Server: gunicorn/19.8.1
Content-Type: application/json
Vary: Accept-Encoding,Accept,Accept-Language,Cookie
X-Frame-Options: SAMEORIGIN
Content-Language: ru
Allow: GET, POST, HEAD, OPTIONS
Content-Encoding: gzip
Via: 1.1 www.ltcompany.com
Connection: close
Transfer-Encoding: chunked
Response Body
Это в консоли вываливает
URL = "ltcompany.com";
ЗаголовокЗапросаHTTP = Новый Соответствие();
ЗаголовокЗапросаHTTP.Вставить("Content-Type: ", "application/json-rpc");
ЗаголовокЗапросаHTTP.Вставить("Connection", "keep-alive");
ЗаголовокЗапросаHTTP.Вставить("Host", "www.ltcompany.com");
HTTPСоединение = Новый HTTPСоединение(URL,, , , , , Новый ЗащищенноеСоединениеOpenSSL);

HTTPЗапрос = Новый HTTPЗапрос("/api/v2/families/?categories__id=253&language=ru");
HTTPЗапрос.Заголовки.Вставить("Content-Type: ", "application/json");
HTTPЗапрос.Заголовки.Вставить("Connection", "keep-alive");
//HTTPЗапрос.Заголовки.Вставить("Host", "ltcompany.com");

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

Сообщить(""+HTTPОтвет.КодСостояния+" "+HTTPОтвет.ПолучитьТелоКакСтроку());
а=0;
Пробовал так код 301
если строку HTTPЗапрос.Заголовки.Вставить("Host", "ltcompany.com"); открыть то 500 ошибка
108 Garykom
 
гуру
26.11.21
09:24
думаю ничего у тебя не получится
потому что пока сам не понимаешь еще что к чему и валишь все в одну кучу
109 asder117
 
26.11.21
10:12
(108) Запросил описание api. буду его крутить и вникать
110 eklmn
 
гуру
26.11.21
11:53
(109) рано запросил, пиши ещё!
111 asder117
 
26.11.21
15:08
(110) блин думал сам допинаю))