2

我正在尝试使用 BloggerAPI 将 Flickr 的“blog this”功能实现到基于 pl/sql 的 CMS。

当 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>

有没有办法直接从http请求的正文中获取xml数据?还是我正在寻找的其他方法?

谢谢,马克。

4

5 回答 5

2

我向 Oracle 打开了一个服务请求,他们确认 mod_plsql 不支持检索 httpheader 变量。以下是我对 SR 的讨论:

问题分析

我需要确认它,但到目前为止,Mark 的结论对我来说是正确的,即 MOD_PLSQL 总是调用和处理 PLSQL 过程,并且无法读取原始 HTTP 请求,因为 MOD_PLSQL 解析请求并检查是否存在 PLSQL 过程此名称以及是否有要传递的参数。如果没有要传递的参数,但我们提供了 XML 文档之类的其他内容,MODPLSQL 会感到困惑,并认为这是一对新的参数和值,而实际上并非如此。

回答

不,这是不可能的,因为 MOD_PLSQL 只处理带有参数的请求,这些参数可以被解析和翻译为带有多个参数的 PLSQL 过程调用。MOD_PLSQL 没有包含整个请求的“httprequest”变量的概念,就像 java 拥有 HTTPRequest 对象一样

问题分析

得到确认,除非我们将它作为参数传递,否则我们无法从 MOD_PLSQL 中读取它。换句话说,如果我们在 HTTP 请求正文中传递 XML 页面,我们需要使用类似 java 的东西,我们可以在原始模式下处理请求,并且我们可以读取任何 HTTP 标头和 http 正文而不受任何限制。

于 2009-09-18T16:41:44.620 回答
1

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"
Content-Type: text/xml

这在xml之后:

--AaB03x--

现在,您设置了文件上传的过程,如本文所述: 使用 Web PLSQL 进行文件、上传和下载

于 2009-11-18T16:48:27.427 回答
0

使用 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

于 2009-01-17T00:09:11.403 回答
0

我遇到了与 MojoMark 相同的问题(尽管使用不同的外部应用程序)。MojoMark 的后续评论是正确的,read_text 信息没有回答问题。

像 MojoMark 一样,我正在尝试从外部实体接收 POST。我正在尝试编写的 PLSQL 是接收该 POST 并存储它。

我能够毫无问题地编写出站 POST XML,但无法设置接收它的过程。

问题似乎是 PLSQL 过程需要一个变量名,即: http://server/modplsql/testload, POST "data='data'"

但是,POST 的主体只是一个 XML 数据流,没有“=”为参数赋值,因此该函数得到“不匹配或缺少 '='””错误。

似乎应该有一种方法可以告诉 MODPLSQL 只接受像“典型”函数调用一样接受发布数据,但我认为我遗漏了一些明显的东西。

我试图用来接收帖子的基本功能是:procedure testload ( DATA in clob ) as BEGIN htp.print('Input POST stream was ' || DATA )
end testload;

于 2009-05-06T15:20:42.027 回答
0

我可以看到这两个请求之间的唯一显着区别是“期望:100-继续”业务。这似乎是 HTTP 1.1 规范中的一个条款,它允许客户端将请求一分为二。基本上,客户端将标头发送给服务器,服务器必须做出选择。如果它对标头“满意”,它将给出 HTTP 100 响应以指示将接受消息的其余部分。

由于您从 Flickr 获取数据,因此我不确定您对客户端发出的 http 请求的控制级别。从服务器端,可能需要对 Apache 进行配置更改,或者它可能是 mod_plsql 中的一个错误,弹出“!” 灵活的参数标记。

不管怎样,现在的博主api都不是这样的。您可能应该迁移到新的 GData API。

于 2009-08-19T21:28:56.487 回答