![]() |
|
Ошибка 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) видимо,в невнимательности к деталям.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |