#oracle #plsql
#Oracle #plsql
Вопрос:
Я пытаюсь реализовать очень простую PL/SQL
процедуру, позволяющую получить xml
файл из Интернета.
PL/SQL
Код выглядит следующим образом:
SET serveroutput ON SIZE 40000
set escape on
create or replace procedure testProc as
url VARCHAR2(256) := 'http://www.mypage.com/testXML.xml';
req sys.utl_http.req;
resp sys.utl_http.resp;
txt VARCHAR2(100);
begin
req := sys.utl_http.begin_request(url,'GET','HTTP/1.0');
utl_http.set_header(req, 'content-type', 'text/xml;charset=UTF-8');
utl_http.set_header(req, 'content-length', length(txt));
resp := sys.utl_http.get_response(req);
LOOP
sys.utl_http.read_line(resp, txt, TRUE);
dbms_output.put_line(txt);
END LOOP;
sys.utl_http.end_response(resp);
EXCEPTION WHEN sys.utl_http.end_of_body THEN
sys.utl_http.end_response(resp);
end testProc;
/
Я успешно построил процедуру с помощью SQLPlus.
Однако, когда я пытаюсь выполнить его, я получаю следующую ошибку:
SQL> exec testProc;
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>413 Request Entity Too Large</title>
</head><body>
<h1>Request Entity Too Large</h1>
The requested resource<br />/trentad/testXML.xml<br />
does not allow request data with GET requests, or the amount of data provided in
the request exceeds the capacity limit.
</body></html>
PL/SQL procedure successfully completed.
Это странно, поскольку XML-файл, который я хотел бы прочитать, выглядит следующим образом:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<body>Don't forget me this weekend!</body>
</note>
Учитывая, что тот же код, без _ set_header_ functions
которого нормально работает обычный HTML
, корректно предоставляет исходную страницу, пожалуйста, кто-нибудь может объяснить мне, почему он не работает с простым xml
файлом?
Ответ №1:
Почему вы устанавливаете content-type и content-length в своем запросе GET? Ваш запрос GET не может иметь никакого тела (объекта запроса). Это не сообщение.
utl_http.set_header(req, 'content-type', 'text/xml;charset=UTF-8');
utl_http.set_header(req, 'content-length', length(txt));
Вы должны сделать это для ответа.
Комментарии:
1. Хорошо, да, вы правы. Однако, как установить заголовок для ответа? Возможно, это глупый вопрос, но я не нашел ни одного документа или руководства для обработки этого варианта использования.
2. Страница на
http://www.mypage.com/testXML.xml
которой будет отправлен ответ и установлены заголовки ответа. Ваш код PL / SQL просто отправляет запрос. Я думаю, вам не нужно устанавливать заголовки ответов в вашем коде PL / SQL.
Ответ №2:
Из вашего вопроса в ответе lkuty следует, что вы ищете заголовок Accept . Это информирует сервер о том, какие типы вы примете в ответ.