Имя: Пароль:
1C
1С v8
Ошибка http запроса к веб-сервису
0 Ivan_495
 
24.06.22
19:21
Создал в 1с xml запрос  post ,  передает массив чисел на сервис и получает в ответ значение. В 1с запускаю вылетает с ошибкой 500 авторизация. Ловлю запрос fiddler ром , копирую в soap UI все выполняется без ошибок.
1 ДедМорроз
 
24.06.22
19:30
Заголовки смотреть внимательно.
Опять же,ключи (cookies) могут хранится с прошлого раза,но не в 1с.
2 Ivan_495
 
24.06.22
19:33
Запрос get к тому же сервису без передачи параметров проходит без проблем из 1с.
3 ДедМорроз
 
24.06.22
19:53
Ну,get без параметров,возможно и авторизации не требует.
Нужно смотреть внимательно,что в заголовках,когда работает и когда нет.
4 Ivan_495
 
24.06.22
20:19
Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type", "application/json;charset=utf-8");
    Заголовки.Вставить("Authorization",TTTT);

Заголовки обычные, 1с  параметры не понимает
5 ДедМорроз
 
24.06.22
20:29
Так параметры еще проще сравнить.
6 Ivan_495
 
24.06.22
20:33
get без авторизации не проходит
7 Ivan_495
 
24.06.22
20:36
вот тэг , 5555 параметр, SOAP эту конструкцию понимает , 1с нет

|      <tem:request>
|         <sco:UnitIds>
|          <arr:int>5555</arr:int>
|             </sco:UnitIds>
|      </tem:request>
8 Ivan_495
 
24.06.22
20:37
в 1с

СтрокаSOAP = "....

|      <tem:request>
|         <sco:UnitIds>
|          <arr:int>5555</arr:int>
|             </sco:UnitIds>
|      </tem:request>

....";
9 Ivan_495
 
24.06.22
21:02
может кто передавал параметры в функцию внешнего веб- сервиса? подскажите , как делали?
10 Ivan_495
 
24.06.22
21:27
какими внешними библиотеками пользутесь для http запросов с передачей параметров внешнему веб- сервису?
11 arsik
 
гуру
24.06.22
21:28
(9) Ну так наверно туда вебсервисом ломится нужно, а не через http.
12 Ivan_495
 
24.06.22
21:56
(11) через ws- ссылку пробовал, ошибка параметра
не пропускает 1с arrayofinteger.
|          <arr:int>5555</arr:int>
|             </sco:UnitIds>
запрос строкой самый дубовый способ, но и он не проходит.
13 youalex
 
25.06.22
00:31
(12) как дословно ошибка выглядит?
через ws прокси обычно отдается не строка, а объект XDTO (его ты возможно сможешь заполнить из своей xml строки)
14 youalex
 
25.06.22
00:47
+ к вебсервису можно отправлять хттп запросы, только их нужно "оборачивать" в протокол soap, типа

    ПространствоИмен = ПространствоИмен();
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    Запись.ЗаписатьНачалоЭлемента("soap:Envelope");
    Запись.ЗаписатьСоответствиеПространстваИмен("soap"    , "http://schemas.xmlsoap.org/soap/envelope/");
    Запись.ЗаписатьСоответствиеПространстваИмен("qqq"    , ПространствоИмен);
    Запись.ЗаписатьНачалоЭлемента("soap:Body");

    Запись.ЗаписатьБезОбработки(ТелоЗапроса); //
    
        Запись.ЗаписатьКонецЭлемента();
    Запись.ЗаписатьКонецЭлемента();
    
    Возврат Запись.Закрыть();
15 ДедМорроз
 
25.06.22
11:46
(11) web-сервич это тот же http,но со строгой типизацией данных.
Хочет человек научиться,что внутри,пусть учится.
16 Ivan_495
 
25.06.22
12:45
(13) Ошибка 500 (Internal Server Error)
17 Ivan_495
 
25.06.22
12:46
(14) а можно soap просто строкой описать и передать , см.(8)
18 Ivan_495
 
25.06.22
12:48
вот этот кусок кода в soap ui отрабатывает без ошибок
|      <tem:request>
|         <sco:UnitIds>
|          <arr:int>5555</arr:int>
|             </sco:UnitIds>
|      </tem:request>
а в 1с возвращает ошибку 500
19 ДедМорроз
 
25.06.22
13:21
(18) еще раз - из 1с при обращении к сервису
Или у вас в 1с сервис,в который вы хотите запихать массив,а он не лезет?
20 Ivan_495
 
25.06.22
13:37
(19) я обращаюсь из 1с к внешнему веб- сервису по протоколу soap
21 Ivan_495
 
25.06.22
14:16
сделал как в (14)

Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    Запись.ЗаписатьНачалоЭлемента("soap:Envelope");

    Запись.ЗаписатьСоответствиеПространстваИмен("soapenv"    , "http://schemas.xmlsoap.org/soap/envelope/");

    Запись.ЗаписатьСоответствиеПространстваИмен("tem"    , "");
    
    Запись.ЗаписатьСоответствиеПространстваИмен("sco"    , "");

    Запись.ЗаписатьСоответствиеПространстваИмен("arr"    , "http://schemas.microsoft.com/2003/10/Serialization/Arrays");
    
    Запись.ЗаписатьНачалоЭлемента("soap:Body");

    
    ТелоЗапроса="arr:int>51006</arr:int>";


    Запись.ЗаписатьБезОбработки(ТелоЗапроса); //

    

        Запись.ЗаписатьКонецЭлемента();

    Запись.ЗаписатьКонецЭлемента();
    
    Запись.Закрыть();

  
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type", "text/xml");
    Заголовки.Вставить("Accept-Charset", "utf-8");
    Заголовки.Вставить("Content-Charset", "utf-8");
    Заголовки.Вставить("Authorization",TOKEN);


    HTTPЗапрос2 = Новый HTTPЗапрос("/..........", Заголовки);
    HTTPЗапрос2.УстановитьТелоИзСтроки(Запись);

    Результат = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос2);
    ////////////////////////////////////

    Если  Результат.КодСостояния =200  Тогда
    
Результат тот же , ошибка 500
23 ДедМорроз
 
25.06.22
15:55
УстановитьТелоИзСтроки
А Запись у вас не строка,а приводится к строке.
Строка=Запись.Закрыть();
Запрос.УстановитьТелоИзСтроки(Строка);

И должнл работать.
24 ДедМорроз
 
25.06.22
15:55
Вы на сервер передаете фразу "ЗаписьXML"
25 Ivan_495
 
25.06.22
18:04
Как передать запись xml  в запрос.установитьтелоизфайла()?
26 ДедМорроз
 
25.06.22
18:18
(25) в (23) указано,как отправить строку.
Если хочется в файл,то запись xml сохранить в файл,а после этот же файл (имя файла)указать в установке тела.
27 Greeen
 
25.06.22
18:19
А что там за авторизация на сервисе, не digest случайно?
28 Greeen
 
25.06.22
18:30
(27) Если не digest, то можно
Проверить корректность адреса ВС (HTTPЗапрос2 = Новый HTTPЗапрос("/..........", Заголовки); - тут только гадать, что в оригинале
29 Ivan_495
 
27.06.22
12:35
собираю строку запроса, смотрю в отладчике и копирую в soap ui, все выполняется, а если продолжить выполнение в 1с , то ошибка 500,405
30 Ivan_495
 
27.06.22
12:43
1с меняет код.
31 Kassern
 
27.06.22
12:45
(29) вы сделали, как вам написали в (23) ?
32 Kassern
 
27.06.22
12:45
Показывайте уже код, который у вас получился. Формирование xmlки можете обрезать
33 Ivan_495
 
27.06.22
12:50
СтрокаSOAP = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:tem=""http://tempuri.org/"" xmlns:sco=""http://schemas.datacontract.org/2004/07/xxxx.Plugins.Spic.Server.Infrastructure.Data"" xmlns:arr=""http://schemas.microsoft.com/2003/10/Serialization/Arrays"">
    |<soapenv:Header/>
    |<soapenv:Body>
    |  <tem:GetAllUnitsPaged>
    |     <tem:request>
    |         <sco:Count>10</sco:Count>
    |           <sco:Offset>0</sco:Offset>
    |     </tem:request>
    |  </tem:GetAllUnitsPaged>
    |</soapenv:Body>
    |</soapenv:Envelope>";

    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Accept","json");
    Заголовки.Вставить("Content-Type","application/json");
    
    
    Заголовки.Вставить("Authorization",TOKEN);


    
    

    HTTPЗапрос1 = Новый HTTPЗапрос("/xxx/units/rest/getAllUnitsPaged", Заголовки);
    HTTPЗапрос1.УстановитьТелоИзСтроки(СтрокаSOAP);

    Результат = HTTPСоединение.Получить(HTTPЗапрос1);
34 Kassern
 
27.06.22
12:53
(33) Вы уверены что должно быть это?
Заголовки.Вставить("Accept","json");
    Заголовки.Вставить("Content-Type","application/json");
35 Ivan_495
 
27.06.22
12:54
(34) убирал эти заголовки не помогает. get запрос проходит с ними на ура.
36 Kassern
 
27.06.22
12:59
(35) так нужно не убирать, а указать верные заголовки. Например application/x-www-form-urlencoded для Content-Type попробовать
37 Kassern
 
27.06.22
13:00
Accept скорее всего можно не указывать
38 Ivan_495
 
27.06.22
13:04
пробовал
Заголовки.Вставить("Content-Type","application/x-www-form-urlencoded");

ошибка 405
39 Kassern
 
27.06.22
13:08
(38) блин, отучитесь уже пользоваться методами Получить (Get) и ОтправитьДляОбработки (Post). Вы тут всем пишите про пост запрос, пихаете тело запроса, а сами используете гет метод. Прописывайте лучше явно, какой вам метод нужен, тогда таких ошибок детских не будет. ВызватьHTTPМетод(<HTTPМетод>, <HTTPЗапрос>, <ИмяВыходногоФайла>)
40 Kassern
 
27.06.22
13:10
вам и возвращается 405 ошибка, читаем внимательно, что она означает. "405 Method Not Allowed. Код состояния протокола HTTP 405 Method Not Allowed, указывает, что метод запроса известен серверу, но был отключён и не может быть использован". Сервер знает о методе который вы собираетесь выполнить, но не может, так как вы суете ему гет запрос...
41 Ivan_495
 
27.06.22
13:10
HTTPЗапрос1.УстановитьТелоИзСтроки(СтрокаSOAP);   метод post
42 Kassern
 
27.06.22
13:10
(41) походу вы не поняли...
43 Ivan_495
 
27.06.22
13:11
HTTPЗапрос1 = Новый HTTPЗапрос("/xxx/units/rest/getAllUnitsPaged", Заголовки);
    HTTPЗапрос1.УстановитьТелоИзСтроки(СтрокаSOAP); //Post

    Результат = HTTPСоединение.Получить(HTTPЗапрос1);
44 Kassern
 
27.06.22
13:11
(41) УстановитьТелоИзСтроки, это лишь метод, который заполняет HTTP запрос. Но по факту вы его не вызываете, вы лишь что-то там на своей стороне позаполняли в 1с. Вся "магия" происходит на этапе (39)
45 Kassern
 
27.06.22
13:12
пока вы не вызвали Получить (Get), ОтправитьДляОбработки (Post),  ВызватьHTTPМетод(<HTTPМетод>, <HTTPЗапрос>, <ИмяВыходногоФайла>) вы вообще с сервером не взаимодействуете и следовательно никаких методов не вызываете.
46 Ivan_495
 
27.06.22
13:14
getAllUnitsPaged  это метод post так написано в документации с парметрами 10,0
47 Ivan_495
 
27.06.22
13:15
да здесь езультат = HTTPСоединение.Получить(HTTPЗапрос1); д.б отправитьдля обработки
48 Kassern
 
27.06.22
13:15
(46) откройте СП 1с и почитайте за методы. Вы можете сколько угодно со мной спорить и дальше любиться с ошибкой 405, а можете все таки попытаться вызвать метод POST как я вам написал выше.
49 Ivan_495
 
27.06.22
13:16
Результат = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос1);

результат 500
50 Ivan_495
 
27.06.22
13:18
вот со всеми исправлениями, результат 500

СтрокаSOAP = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:tem=""http://tempuri.org/"" xmlns:sco=""http://schemas.datacontract.org/2004/07/.Plugins.Spic.Server.Infrastructure.Data"" xmlns:arr=""http://schemas.microsoft.com/2003/10/Serialization/Arrays"">
    |<soapenv:Header/>
    |<soapenv:Body>
    |  <tem:GetAllUnitsPaged>
    |     <tem:request>
    |         <sco:Count>10</sco:Count>
    |           <sco:Offset>0</sco:Offset>
    |     </tem:request>
    |  </tem:GetAllUnitsPaged>
    |</soapenv:Body>
    |</soapenv:Envelope>";

    
    Заголовки = Новый Соответствие;
    
    Заголовки.Вставить("Content-Type","application/x-www-form-urlencoded");
    
    
    Заголовки.Вставить("ScoutAuthorization",TOKEN);


    HTTPЗапрос1 = Новый HTTPЗапрос("//units/rest/getAllUnitsPaged", Заголовки);
    HTTPЗапрос1.УстановитьТелоИзСтроки(СтрокаSOAP);

    Результат = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос1);
    ////////////////////////////////////

    Если  Результат.КодСостояния =200  Тогда
51 Ivan_495
 
27.06.22
13:19
а вот рабочий

    СтрокаSOAP = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org//envelope/"" xmlns:tem=""http://tempuri.org/"">
    |<soapenv:Header/>
    |<soapenv:Body>
    |<tem:GetAllUnitsIds/>
    |</soapenv:Body>
    |</soapenv:Envelope>";

    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Accept","json");
    Заголовки.Вставить("Content-Type","application/json");
    Заголовки.Вставить("ScoutAuthorization",TOKEN);



    HTTPЗапрос1 = Новый HTTPЗапрос("//units/rest/getAllUnits", Заголовки);
    HTTPЗапрос1.УстановитьТелоИзСтроки(СтрокаSOAP);

    Результат = HTTPСоединение.Получить(HTTPЗапрос1);
    ////////////////////////////////////

    Если  Результат.КодСостояния =200  Тогда
52 Kassern
 
27.06.22
13:23
(51) "а вот рабочий" - если бы он был рабочим, вы бы вряд ли тут создали ветку)
53 Kassern
 
27.06.22
13:24
(50) " HTTPЗапрос1 = Новый HTTPЗапрос("//units/rest/getAllUnitsPaged", Заголовки);"  а что там правда два слеша стоит вначале?
54 Kassern
 
27.06.22
13:24
500 ошибка значит, что метод сервер понял, попробовал выполнить ваш запрос и не смог
55 Ivan_495
 
27.06.22
13:25
(52) он рабочий , но get и без параметров))
56 Ivan_495
 
27.06.22
13:26
вот с "POST"

    СтрокаSOAP = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:tem=""http://tempuri.org/"" xmlns:sco=""http://schemas.datacontract.org/2004/07/.Plugins.Spic.Server.Infrastructure.Data"" xmlns:arr=""http://schemas.microsoft.com/2003/10/Serialization/Arrays"">
    |<soapenv:Header/>
    |<soapenv:Body>
    |  <tem:GetAllUnitsPaged>
    |     <tem:request>
    |         <sco:Count>10</sco:Count>
    |           <sco:Offset>0</sco:Offset>
    |     </tem:request>
    |  </tem:GetAllUnitsPaged>
    |</soapenv:Body>
    |</soapenv:Envelope>";

    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type","application/x-www-form-urlencoded");
    Заголовки.Вставить("Authorization",TOKEN);


    
    

    HTTPЗапрос1 = Новый HTTPЗапрос("//units/rest/getAllUnitsPaged", Заголовки);
    HTTPЗапрос1.УстановитьТелоИзСтроки(СтрокаSOAP);

    
     Результат = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос1);
    ////////////////////////////////////

    Если  Результат.КодСостояния =200  Тогда
57 Ivan_495
 
27.06.22
13:29
(53) нет конечно , там название сайта
58 Kassern
 
27.06.22
13:29
(55) у вас есть документация к данному API? Или вы методом тыка его ковыряете?
59 Ivan_495
 
27.06.22
13:30
есть описание методов api
60 Ivan_495
 
27.06.22
13:30
есть решение на JS
61 Ivan_495
 
27.06.22
13:31
писал такие же вещи к другим сайтам , все работало без проблем
62 Kassern
 
27.06.22
13:32
(57) не надо писать название сайта в HTTP запросе! Блин, вы название сайта указываете еще на этапе хттп соединениея.
Должно быть что-то вроде такого:
Строка ресурса: Сайт.ру/Склады/ПолучитьНужныйСклад.пхп
Соединение = Новый HTTPСоединение(Сайт.Ру,,,,,,);
Запрос= Новый HTTPЗапрос(/Склады/ПолучитьНужныйСклад.пхп);
63 Kassern
 
27.06.22
13:32
(61) потому что делали гет запросы, а сейчас пробуете это провернуть с пост.
64 Ivan_495
 
27.06.22
13:33
делал post к gs1 без проблем
65 Ivan_495
 
27.06.22
13:34
у меня так и написано Новый HTTPЗапрос("/****/units/rest/getAllUnitsPaged",
66 Ivan_495
 
27.06.22
13:34
"/****/units/rest/getAllUnitsPaged"  эта строка взята из api
67 Ivan_495
 
27.06.22
13:36
самое интересное, что когда ловлю отладчиком переменную СтрокаSOAP и копирую ее в soap ui там запрос прозодит на ура!
68 Ivan_495
 
27.06.22
13:38
там какой-то код перевода вроде 1с лепит в строку
69 Kassern
 
27.06.22
13:41
(68) УстановитьТелоИзСтроки(<ТелоКакСтрока>, <Кодировка>, <ИспользоватьBOM>), третий параметр пробовали менять?
70 Ivan_495
 
27.06.22
13:46
нет
71 Kassern
 
27.06.22
13:47
(70) вам же еще в начале топика писали про BOM, попробуйте изменить параметр
72 Ivan_495
 
27.06.22
13:52
HTTPЗапрос1.УстановитьТелоИзСтроки(СтрокаSOAP,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

не помогает ошибка 500
73 Ivan_495
 
27.06.22
15:34
нужно вот такое тело запроса в json

"{  ""Offset"": 0,  ""Count"": 10}"

пишу в 1с

ТелоЗапроса = "{"+  """Offset""" + ":"+ """0"""+"," + """Count"""+":"+ """10"""+"}";

пишет ошибку.
74 Ivan_495
 
27.06.22
15:37
вот такой json
надо сделать

"{^
  ""Offset"": 0,^
  ""Count"": 10^
}"
75 Kassern
 
27.06.22
15:43
Воспользуйтесь конструкцией Новый ЗаписьJSON
76 Kassern
 
27.06.22
15:43
это гораздо лучше, чем вручную текст собирать и дает возможность избежать синтаксических ошибок
77 Ivan_495
 
27.06.22
16:01
ТелоЗапросаJ = Новый Соответствие;
    ТелоЗапросаJ.Вставить("Offset",    0);
    ТелоЗапросаJ.Вставить("Count", 10);


ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТелоЗапросаJ);
СтрокаТела = ЗаписьJSON.Закрыть();
78 Ivan_495
 
27.06.22
18:04
вопрос закрыт, всех благодарю
79 Kassern
 
27.06.22
19:50
(78) в чем ошибка была?
80 ДедМорроз
 
27.06.22
20:48
(79) видимо,в невнимательности к деталям.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.