2011-10-27 7 views
0

非常に簡単なPL/SQLプロシージャを実装して、xmlファイルをWebから取得できるようにしようとしています。PL/SQL utl_http get 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をで手順を構築しました。私はそれを実行しようとすると、 は、しかし、私は次のエラーを取得する:

同じことを考えると
<?xml version="1.0" encoding="ISO-8859-1"?> 
<note> 
    <body>Don't forget me this weekend!</body> 
</note> 

:私が読みたいxmlファイルには、次のいずれかのように

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. 

これは奇妙ですコードは_ set_header_ functionsが正常に正常に動作するHTML、そのソースページを正しく提供してください、なぜ誰も私は簡単なxmlファイルで動作しない理由を説明することができますか?

答えて

2

GETリクエストでコンテンツタイプとコンテンツ長を設定する理由を教えてください。あなたのGETリクエストは、ボディ(リクエストエンティティ)を持つことはできません。これはPOSTではありません。

utl_http.set_header(req, 'content-type', 'text/xml;charset=UTF-8'); 
utl_http.set_header(req, 'content-length', length(txt)); 

応答のためにこれを行う必要があります。

+0

はい、あなたは正しいです。しかし、どのように応答のヘッダーを設定するには?多分それは愚かな質問ですが、このユースケースを扱うためのドキュメントやチュートリアルは見つかりませんでした。 – Raffaello

+0

'http:// www.mypage.com/testXML.xml'のページは、応答を送信し、応答ヘッダを設定するものです。 PL/SQLコードがリクエストを送信するだけです。私はあなたのPL/SQLコードで応答ヘッダーを設定する必要はないと思う。 – lkuty

0

Acceptヘッダーを探していることがlkutyの答えに表示されます。これは、応答として受け入れるタイプをサーバーに通知します。