Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SOAP XML "Фатальная ошибка" / 19 сообщений из 19, страница 1 из 1
24.10.2016, 18:38:40
    #39333071
ora_crab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
Здравствуйте.

Есть у меня PL\Sql процедура для передачи переменных на веб сервис и получения ответа.

DECLARE
v_soap_request VARCHAR2(30000);
v_http_req utl_http.req;
v_http_resp utl_http.resp;
v_name VARCHAR2(32767);
v_value VARCHAR2(32767);
v_txt VARCHAR2(32767);
i NUMBER := 1;
buf CLOB;

BEGIN

-- Define the SOAP request according the the definition of the web service being called
v_soap_request := '<soapenv:Envelope xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/" xmlns:api2=" http://inr.zd.ua/zd/Api20" xmlns:int=" http://inr.zd.ua/zd/integration20">
<soapenv:Header/>
<soapenv:Body>
<api2:AddTTN>
<api2:AddRequest>
<int:Auth>
<int:ID>3E2D96AFD976BDEDE050007F01002B2F</int:ID>
<int:KEY>3E2D96AFD976BDEDE050007F01002B2F</int:KEY>
</int:Auth>
<int:TTN>
<int:Sender>
<int:WarehouseSenderCode>000000863</int:WarehouseSenderCode>
<int:SettlementCode></int:SettlementCode>
<int:SenderAddress>dfvgg fg</int:SenderAddress>
<int:PhoneSender>0665867676</int:PhoneSender>
</int:Sender>
<int:Receiver>
<int:ReceiverClient>Петро Петро Петро</int:ReceiverClient>
<int:WarehouseReceiverCode>0</int:WarehouseReceiverCode>
<!--Optional:-->
<int:SettlementCode></int:SettlementCode>
<int:ReceiverAddress>ааввввкуііі</int:ReceiverAddress>
<int:PhoneReceiver>+380676170556</int:PhoneReceiver>
</int:Receiver>
<int:Number></int:Number>
<int:PaymentType>OTP</int:PaymentType>
<int:DispatchDate>2016-08-14+03:00</int:DispatchDate>
<int:POD>
<int:PodPays>POL</int:PodPays>
<int:PodAmount>0</int:PodAmount>
<int:ReceiverPODThird>
<int:ReceiverPODThird></int:ReceiverPODThird>
<int:WarehouseReceiverPODThird></int:WarehouseReceiverPODThird>
<int:PhoneReceiverPODThird></int:PhoneReceiverPODThird>
</int:ReceiverPODThird>
</int:POD>
<int:ContractorPaysThird>
<int:ContractorPaysThird></int:ContractorPaysThird>
<int:WarehousePaysThird></int:WarehousePaysThird>
<int:PhonePaysThird></int:PhonePaysThird>
</int:ContractorPaysThird>
<int:InsuranceCost>10</int:InsuranceCost>
<int:TransportationType>02</int:TransportationType>
<int:PaymentMethod>cash</int:PaymentMethod>

<!--Zero or more repetitions:-->
<int:AdditionalServices>
<int:AdditionalServicesCode>2</int:AdditionalServicesCode>
<int:AdditionalServicesParametr>15.08.2016 0:00:00;000000007</int:AdditionalServicesParametr>
</int:AdditionalServices>
<int:Cargo>
<int:CargoType>0001</int:CargoType>
<int:CargoDescription>Мобильный телефон Samsung</int:CargoDescription>
</int:Cargo>
<int:CargoParams>
<int:Quantity>1</int:Quantity>
<int:Weight>1</int:Weight>
<int:Volume>0.1</int:Volume>
</int:CargoParams>

<!--Zero or more repetitions:-->
<int:ReservedField>
<int:ReservedFieldName></int:ReservedFieldName>
<int:ReservedFieldValue></int:ReservedFieldValue>
</int:ReservedField>
<int:PAS>333</int:PAS>
<int:ReceiverCompany></int:ReceiverCompany>
<int:SenderCompany></int:SenderCompany>
</int:TTN>
</api2:AddRequest>
</api2:AddTTN>
</soapenv:Body>
</soapenv:Envelope>';

-- Initialise the request
v_http_req := utl_http.begin_request('http://esb.zd.ua/services/zd_api20_sandbox'
, --UTL
'POST'
, -- method
'HTTP/1.1' -- http_version
);
-- set header details

utl_http.set_header(v_http_req
,'Accept-Encoding'
,'gzip,deflate');

utl_http.set_header(v_http_req
,'Content-Type'
,'text/xml;charset=UTF-8');

utl_http.set_header(v_http_req
,'Pragma'
,'no-cache');
utl_http.set_header(v_http_req
,'Cache-Control'
,'no-cache');

utl_http.set_header(v_http_req
,'SOAPAction'
,'http://inr.zd.ua/zd/Api20#API20:AddTTN');

utl_http.set_header(v_http_req
,'Content-Length'
,length(v_soap_request));

utl_http.set_header(v_http_req
,'Host'
,'esb.zd.ua');

utl_http.set_header(v_http_req
,'Connection'
,'Keep-Alive');

utl_http.set_header(v_http_req
,'User-Agent'
,'Apache-HttpClient');
LOOP
buf := substrb(v_soap_request
,i
,2000);
IF buf IS NOT NULL THEN
utl_http.write_text(v_http_req
,v_soap_request);
i := i + 2000;
ELSE
EXIT;
END IF;
END LOOP;

-- call the web service and get the response
v_http_resp := utl_http.get_response(v_http_req);
-- loop through the response headers and write them out
FOR i IN 1 .. utl_http.get_header_count(v_http_resp)
LOOP
utl_http.get_header(v_http_resp
,i
,v_name
,v_value);
dbms_output.put_line('Response header ' || i || '-' || v_name || ': ' ||
v_value);
END LOOP;
-- create a block to trap the end of body exception when no more lines exist.
BEGIN
-- loop through the response text which is the soap e details
LOOP
utl_http.read_line(v_http_resp
,v_txt);
dbms_output.put_line('response line ' || v_txt);
END LOOP;
utl_http.end_response(v_http_resp);
dbms_output.put_line('End of response loop');
EXCEPTION
-- need to trap end of body exception as there is no other graceful way to do it.
WHEN utl_http.end_of_body THEN
utl_http.end_response(v_http_resp);
dbms_output.put_line('End of response loop');
END;
END;


Если всё хорошо, то ответ должен быть 200. OK. и номер ... Но, в место это получаю
"
<soap:Envelope xmlns:soap=" http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Неизвестная ошибка. Ошибка разбора XML: - [41,13]
Фатальная ошибка:
expected '>'
по причине:
Ошибка разбора XML: - [41,13]
Фатальная ошибка:
expected '>'
</faultstring>
<detail/>
</soap:Fault>
</soap:Body>
</soap:Envelope>".

Мои попытки найти ответ в гугле на ошибку "Фатальная ошибка: expected '& gt;'" не увенчались успехом.
Буду благодарен за помощь в решении данной ошибки.

P.S. данный код работает для других методов, которые запрашивают меньше параметров.
...
Рейтинг: 0 / 0
24.10.2016, 19:06:09
    #39333086
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
ora_crab,
очевидно что пакет при передаче корежится, хрустальный шар неуверенно предполагает что тут:
Код: plsql
1.
2.
3.
4.
5.
6.
buf := [color=red]substrb[/color](v_soap_request
,i
,2000);
IF buf IS NOT NULL THEN
utl_http.[color=red]write_text[/color](v_http_req
,v_soap_request);
...
Рейтинг: 0 / 0
24.10.2016, 19:19:31
    #39333093
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
ora_crabЕсть у меня PL\Sql процедура
Код: plsql
1.
DECLARE

Врёшь, это не процедура.ora_crab
Код: plsql
1.
2.
3.
4.
5.
6.
EXCEPTION
-- need to trap end of body exception as there is no other graceful way to do it.
WHEN utl_http.end_of_body THEN
utl_http.end_response(v_http_resp);
dbms_output.put_line('End of response loop');
END;

Готовься к ORA-29270: too many open HTTP requests
...
Рейтинг: 0 / 0
24.10.2016, 19:29:45
    #39333098
ora_crab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
XMLer,

Спасибо за ответ, но как-то не помог он. Ругается то на "[", то на количество аргументов ...
А Вы не знаете могу ли я посмотреть, что именно оракл передаёт?

В SoapUI этот XML работает корректно + логи можно легко посмотреть
...
Рейтинг: 0 / 0
24.10.2016, 20:03:44
    #39333120
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
XMLer,

хрустальный шар неуверенно предполагает

замечательно)
...
Рейтинг: 0 / 0
24.10.2016, 20:19:14
    #39333126
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
ora_crabXMLer,

Спасибо за ответ, но как-то не помог он. Ругается то на "[", то на количество аргументов ...
А если мозг включить?

XMLer намекал, что buf нарезается поБАЙТНО, а отправляется ТЕКСТ, что на мультибайте запросто может приводить к покореженным символам.
Но дело даже не в этом.
Вопрос - нафига повторять весть v_soap_request ceil(lengthb(v_soap_request)/2000) раз?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
LOOP
buf := substrb(v_soap_request
,i
,2000);
IF buf IS NOT NULL THEN
utl_http.write_text(v_http_req
,v_soap_request);
i := i + 2000;
ELSE
EXIT;
END IF;
END LOOP;
...
Рейтинг: 0 / 0
24.10.2016, 20:21:20
    #39333127
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
ora_crabА Вы не знаете могу ли я посмотреть, что именно оракл передаёт?

В SoapUI этот XML работает корректно + логи можно легко посмотреть
Забавно.
Пользоватьcя SOAPUI и не суметь подвесить monkey, чтобы посмотреть "что именно оракл передаёт"...
...
Рейтинг: 0 / 0
24.10.2016, 20:25:59
    #39333130
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
http://esb.zd.ua с логотипом wso2...esb
...
Рейтинг: 0 / 0
24.10.2016, 21:00:17
    #39333136
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
Dmitry.esb.zd.uaнапомнило слово из девяти букв с одной гласной.
...
Рейтинг: 0 / 0
24.10.2016, 21:37:44
    #39333141
ora_crab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
andrey_anonymousXMLer намекал
я с XML столкнулся неделю назад, как он работает и намёки понимать ещё не научился.
andrey_anonymousВопрос - нафига повторять весть v_soap_request ceil(lengthb(v_soap_request)/2000) раз?
в моём случае цикл повторяется два раза, т.к. v_soap_request больше 2000 байт, а utl_http.write_text может передавать в пределах 2000 байт.
andrey_anonymousа отправляется ТЕКСТ, что на мультибайте запросто может приводить к покореженным символам.
знаете ли Вы метод, которым можно передать нормально символы передать либо проверить правильность передачи?
...
Рейтинг: 0 / 0
24.10.2016, 22:24:23
    #39333155
ora_crab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
andrey_anonymousora_crabА Вы не знаете могу ли я посмотреть, что именно оракл передаёт?

В SoapUI этот XML работает корректно + логи можно легко посмотреть
Забавно.
Пользоватьcя SOAPUI и не суметь подвесить monkey, чтобы посмотреть "что именно оракл передаёт"...
да, не умею, по этому и спрашиваю. подсказать можете?
...
Рейтинг: 0 / 0
25.10.2016, 10:02:39
    #39333293
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
ora_crabя с XML столкнулся неделю назад, как он работает и намёки понимать ещё не научился.
XML - стандарт а не API, он не может работать. В качестве API ты используешь utl_http, его и изучай.

ora_crab знаете ли Вы метод, которым можно передать нормально символы передать либо проверить правильность передачи?
Самый надежный метод проверить правильность передачи- передать пакет в своему приложению и визуализировать результат.
...
Рейтинг: 0 / 0
25.10.2016, 10:09:25
    #39333299
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
ora_crab,

у меня эта ф-ция работает:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
CREATE FUNCTION httpPost
(
    p_url     IN VARCHAR2,
    p_data    IN CLOB,
    p_timeout IN BINARY_INTEGER DEFAULT 60
) 
    RETURN CLOB
IS
    --
    v_request  utl_http.req;
    v_response utl_http.resp;
    v_buffer   CLOB;
    v_chunk    VARCHAR2(4000);
    v_length   NUMBER;
    v_index    NUMBER;
BEGIN

    v_index := 1;
    v_length := nvl(length(p_data), 0);

    -- configure HTTP
    utl_http.set_response_error_check(enable => FALSE);
    utl_http.set_detailed_excp_support(enable => FALSE);
    utl_http.set_transfer_timeout(p_timeout);

    -- send request
    v_request := utl_http.begin_request(p_url, 'POST','HTTP/1.0');
    utl_http.set_header(v_request, 'Content-Type', 'text/xml');
    utl_http.set_header(v_request, 'Content-Length', v_length);
    WHILE v_index <= v_length LOOP
        utl_http.write_text(v_request, substr(p_data, v_index, 4000));
        v_index := v_index + 4000;
    END LOOP;

    -- check HTTP status code for error
    IF v_response.status_code <> utl_http.http_ok THEN   
        raise_application_error(-20400,v_response.status_code || ' - ' || v_response.reason_phrase);
    END IF;

    -- get response
    dbms_lob.createtemporary(v_buffer, FALSE);
    v_response := utl_http.get_response(v_request);
    BEGIN
        LOOP
            utl_http.read_text(v_response, v_chunk, 4000);
            dbms_lob.writeappend(v_buffer, length(v_chunk), v_chunk);
        END LOOP;
    EXCEPTION
        WHEN utl_http.end_of_body THEN NULL;
    END;
    utl_http.end_response(v_response);

    RETURN v_buffer;

END;




соответственно твой вызов будет:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select httppost(
'http://esb.zd.ua/services/zd_api20_sandbox', 
'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:api2="http://inr.zd.ua/zd/Api20" xmlns:int="http://inr.zd.ua/zd/integration20">
<soapenv:Header/>
<soapenv:Body>
...ИТД...
') 
from dual
...
Рейтинг: 0 / 0
25.10.2016, 10:46:38
    #39333340
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
ora_crabandrey_anonymousВопрос - нафига повторять весь v_soap_request ceil(lengthb(v_soap_request)/2000) раз?
в моём случае цикл повторяется два раза, т.к. v_soap_request больше 2000 байт, а utl_http.write_text может передавать в пределах 2000 байт.
Как в анекдоте:
- Вовочка, что выберешь: Машу один раз или Мишу да раза?
- Маша - она, конечно, Маша, но ДВА раза - это все-таки ДВА раза...

Нарезали в buf:
Код: plsql
1.
2.
LOOP
buf := substrb(v_soap_request,i,2000);



Но два раза - это же ДВА раза!!!
Потому отправим не buf, а v_soap_request.
Дважды, ага...

Код: plsql
1.
utl_http.write_text(v_http_req,v_soap_request);



ora_crabandrey_anonymousа отправляется ТЕКСТ, что на мультибайте запросто может приводить к покореженным символам.
знаете ли Вы метод, которым можно передать нормально символы передать либо проверить правильность передачи?

Метод знаю - и передать, и проверить.
Но чесслово, уже не верю что поможет.
...
Рейтинг: 0 / 0
25.10.2016, 11:19:22
    #39333367
ora_crab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
Dmitry., спасибо за ответ! функция выдаёт тот же результат, что и мой код.
...
Рейтинг: 0 / 0
25.10.2016, 11:27:26
    #39333383
ora_crab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
andrey_anonymous,

прежде, чем сюда писать я пробовал два варианта, изначально отправлял без цикла, то есть - utl_http.write_text(v_http_req, v_soap_request);

выдавало ту же ошибку, что и с циклом

loop
buf := SUBSTRB(v_soap_request,i, 2000);
if buf is not null then
utl_http.write_text(v_http_req, v_soap_request);
dbms_output.put_line('send ' || i);
i:=i + 2000;
else
exit;
end if;
end loop;

сложно мне понять цель ваших ответов ... никогда не понимал людей, которые пытаются самоутвердиться за счёт того, что кто-то что-то не знает или пока ещё не понял.
...
Рейтинг: 0 / 0
25.10.2016, 13:36:17
    #39333549
SOAP XML "Фатальная ошибка"
ora_crab ... никогда не понимал людей, которые пытаются самоутвердиться за счёт того, что кто-то что-то не знает или пока ещё не понял.ну кто за чей счет пытается проехать тут не понятно только непонятливым.
Мне вот понятно, что некоторым не дано осмыслить инженерный подход. Прочесть полноценно изложенный материал, задаться вопросами, поставить эксперимент... сделать выводы. Считают, что интернет заменяет голову.
Но зачем, если не дано, лезть в профессию?
...
Рейтинг: 0 / 0
25.10.2016, 14:30:24
    #39333606
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
ora_crabсложно мне понять
По ходу безнадежен.
...и красным подсветил, и два раза рассказал - как об стенку горох...

Последняя попытка - отошлю к доке на SoapUI, если не сумеете использовать для отладки - уже и не знаю, чем еще можно помочь:
https://www.soapui.org/soap-mocking/getting-started.html
...
Рейтинг: 0 / 0
26.10.2016, 11:43:34
    #39334246
ora_crab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP XML "Фатальная ошибка"
Нашёл решение.
В случае отправки большого XML, как в моём случае, нужна такая строчка кода

UTL_HTTP.SET_HEADER(v_http_req, NAME => 'Transfer-Encoding', VALUE => 'chunked');
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SOAP XML "Фатальная ошибка" / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]