Как получить XML в Oracle PL / SQL через транзакцию HTTP Post? - PullRequest
2 голосов
/ 17 января 2009

Я пытаюсь реализовать функцию "blog this" из Flickr с помощью BloggerAPI для моей CMS на основе pl / sql.

Когда Flickr отправляет мне транзакцию публикации, HTTP-транзакция выглядит следующим образом:

POST /pls/website/!pkg.procAPI HTTP/1.1
Host: www.mydomain.com
Accept: */*
User-Agent: Flickr
Content-Type: text/xml; charset=utf-8
Content-Length: 1220
Expect: 100-continue

<?xml version="1.0" encoding="utf-8"?>
<methodCall>
    <methodName>blogger.newPost</methodName>
    <params>
        <param><value><string>NO_APP_KEY</string></value></param>
        <param><value><string>1</string></value></param>
        <param><value><string>markj</string></value></param>
        <param><value><string>markj</string></value></param>
        <param><value><string>This is a test post from &lt;a href=&quot;http://www.flickr.com/r/testpost&quot;&gt;&lt;img alt=&quot;flickr&quot; src=&quot;http://www.flickr.com/images/flickr_logo_blog.gif&quot; width=&quot;41&quot; height=&quot;18&quot; border=&quot;0&quot; align=&quot;absmiddle&quot; /&gt;&lt;/a&gt;, a fancy photo sharing thing.</string></value></param>
        <param><value><boolean>1</boolean></value></param>
    </params>
</methodCall>

Но мой сервер отвечает неверным запросом HTTP-400, и появляется сообщение об ошибке «Несоответствие подписи или отсутствует» = «, и моя процедура pl / sql никогда не получает возможности обработать запрос. Я подозреваю, что гибкая передача параметров скрывается при просмотре сообщения, но я не знаю, как еще

Кажется, что процесс получения доступных блогов работает нормально, но содержание запроса не содержит всех html-сущностей как части сообщения:

    POST /pls/website/!pkg.procAPI HTTP/1.1
Host: www.mydomain.com
Accept: */*
User-Agent: Flickr
Content-Type: text/xml; charset=utf-8
Content-Length: 304

<?xml version="1.0" encoding="utf-8"?>
<methodCall>
    <methodName>blogger.getUsersBlogs</methodName>
    <params>
        <param><value><string>NO-APP-KEY</string></value></param>
        <param><value><string>mark</string></value></param>
        <param><value><string>markj</string></value></param>
    </params>
</methodCall>

Есть ли способ получить данные xml из тела http-запроса напрямую? или какой-то другой подход, который я просматриваю?

Спасибо, Отметка.

Ответы [ 5 ]

2 голосов
/ 18 сентября 2009

Я открыл запрос на обслуживание в Oracle, и они подтвердили, что mod_plsql не поддерживает получение переменных httpheader. Вот обсуждение, которое я имел на SR:

АНАЛИЗ ВЫПУСКА

Мне нужно это подтвердить, но вывод Марка пока мне подходит, т.е. MOD_PLSQL всегда вызывает и обрабатывает процедуры PLSQL, и нет способа прочитать необработанный HTTP-запрос, потому что MOD_PLSQL анализирует запрос и проверяет, существует ли процедура PLSQL с этим именем и есть ли аргументы для передачи. Если нет аргументов для передачи, но мы предоставляем что-то еще, например, документ XML, MODPLSQL озадачен и думает, что это новая пара параметров и значений, когда это не совсем так.

ОТВЕТ

Нет, это невозможно сделать, потому что MOD_PLSQL просто обрабатывает запросы с параметрами, которые могут быть проанализированы и преобразованы как вызов процедуры PLSQL с несколькими аргументами. MOD_PLSQL не имеет понятия о переменной «httprequest», содержащей весь запрос, точно так же, как у java есть объект HTTPRequest

АНАЛИЗ ВЫПУСКА

Получили подтверждение, если мы не передадим его как параметр, мы не сможем прочитать его из MOD_PLSQL. Другими словами, если мы передаем страницу XML в теле HTTP-запроса, нам нужно использовать что-то вроде java, где мы можем обрабатывать запрос в необработанном режиме и читать любой заголовок HTTP и тело http без каких-либо ограничений.

1 голос
/ 18 ноября 2009

Можно ли отправить xml как вложение файла? Другими словами изменить:

Content-Type: text/xml; charset=utf-8

до

Content-Type: multipart/form-data, boundary=AaB03x

Затем добавьте это перед xml:

--AaB03x content-disposition: form-data; name="xmlfile"; filename="myfile.xml"<br/> Content-Type: text/xml<br/></p> <p>

И это после xml:

--AaB03x--

Теперь вы настроили процедуру загрузки файла, как описано в этой статье: Файлы, загрузки и загрузки с помощью Web PLSQL

0 голосов
/ 06 мая 2009

Я столкнулся с той же проблемой, что и MojoMark (хотя с другим внешним приложением). Последующий комментарий MojoMark правильный, информация read_text не отвечает на вопрос.

Как и MojoMark, я пытаюсь получить сообщение от внешнего лица. PLSQL, который я пытаюсь написать, должен получить этот POST и сохранить его.

Я смог написать исходящий POST XML без проблем, но не смог настроить процедуру для его получения.

Проблема, по-видимому, в том, что процедура PLSQL хочет получить имя переменной, т.е. http://server/modplsql/testload, POST "data = 'data'"

Однако тело POST - это просто поток данных XML, при этом «=» не присваивает значение параметру, поэтому функция получает ошибку «Mismatch or Missing '='» ".

Похоже, должен быть способ заставить MODPLSQL просто принять прием данных поста, как "типичный" вызов функции, но я думаю, что я упускаю что-то очевидное.

Основная функция, которую я пытаюсь использовать для получения сообщения: Тестовая загрузка процедуры (DATA in clob) как НАЧАТЬ htp.print ('входной поток POST был' || DATA)
конечная нагрузка;

0 голосов
/ 20 августа 2009

Единственное существенное различие, которое я вижу между этими двумя запросами, - это бизнес "Ожидание: 100-продолжение". Это относится к разделу спецификации HTTP 1.1, который позволяет клиенту разделить запрос на две части. По сути, клиент отправляет заголовок на сервер, и сервер должен сделать выбор. Если он «доволен» заголовком, он выдаст ответ HTTP 100, чтобы указать, что остальная часть сообщения будет принята.

Поскольку вы получаете данные от Flickr, я не уверен, какой у вас уровень контроля над http-запросами, выполняемыми клиентом. Со стороны сервера может потребоваться изменить конфигурацию Apache, или это может быть ошибка в mod_plsql, которая появляется с "!" гибкий маркер параметров.

В любом случае, текущий API блогера не такой. Возможно, вам следует перейти на новый API GData.

0 голосов
/ 17 января 2009

Использовать UTL_HTTP

Для этого вы можете использовать пакет UTL_HTTP.

UTL_HTTP.read_text(
   r     IN OUT NOCOPY resp,
   data  OUT NOCOPY VARCHAR2,
   len   IN PLS_INTEGER DEFAULT NULL);

"Пакет UTL_HTTP поддерживает фрагментированное кодирование передачи HTTP 1.1. Когда тело ответа возвращается в формате кодированного фрагмента передачи, как указано в заголовке ответа, пакет автоматически декодирует блоки и возвращает тело ответа формат. "

http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96612/u_http.htm

...