sql 查询web页面_将Web服务整合到您SQL查询中

本文介绍了如何使用DB2 for i的HTTP用户定义函数(UDF)和用户定义表函数(UDTF)来集成Web服务。通过HTTP功能,数据库开发人员可以将SQL查询与Web服务结合,实现数据的获取和处理。示例展示了一个SQL查询,该查询从DB2 for i博客获取先前发布的条目,涉及URL构造、HTTP方法、响应处理以及XML数据的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

超文本传输​​协议(HTTP)协议是最常用的Internet协议之一。 使用HTTP,可以通过统一资源定位器(URL)访问Web服务和其他在线信息资源。

通过将新的HTTP函数用作系统资源,DB2 for i为数据库开发人员开辟了一条新途径,以使数据库开发人员可以使用SQL合并Web服务。

新的HTTP用户定义函数(UDF)和用户定义表函数(UDTF)用Java™编写,它们存在于SYSTOOLS模式中。 SYSTOOLS与DB2 for i提供的其他模式不同,因为它不是缺省系统路径的一部分。 SYSTOOLS包含一组DB2 for i提供的示例和工具。 SYSTOOLS中的工具和示例被认为可以立即使用,但不属于任何IBM产品。 因此,它们不受IBM服务和支持的约束。

本文概述了新的HTTP函数,并提供了一个示例,展示了如何使用这些函数来请求Web服务并将数据结果与内置XML支持集成在一起,该内置XML支持也是DB2 for i 7.1支持的一部分。 该示例说明如何设计一个SQL查询,该查询从DB2 for i博客返回以前发布的条目。

先决条件

为了对DB2 i 7.1使用HTTP功能,必须在系统上安装以下软件。

  • DB2 PTF组SF99701级别23
  • Java 1.6或更高版本(5761-JV1选项11、12、14或15)

HTTP功能概述

HTTP UDF和UDTF使用以下命名约定命名:

HTTP<method><data-type><verbose>
  • method表示HTTP函数。 支持所有常见的HTTP方法,包括POSTGETPUTDELETEHEAD 。 有关HTTP方法的更多信息,可以参考参考资料部分中的超文本传输​​协议链接。
  • data-type可以是CLOBBLOB ,它表示返回的HTTP响应消息的数据类型,或者在某些情况下(例如PUTPOST )表示请求消息的类型。
  • DB2 for i为每种方法和数据类型组合提供HTTP函数的详细版本和非详细版本。
    • 具有“ verbose”后缀的函数是表函数。 该表函数返回以下两者:结果集中的响应HTTP标头和响应消息。 响应HTTP标头包括响应代码和标头字段。 响应代码指示请求是否成功。 标头字段包含有关响应的其他信息。
    • 不带“ verbose”功能的函数是标量函数,仅返回响应消息。

例如, HTTPPUTBLOBVERBOSE是一个表函数,它将使用PUT方法发送和接收BLOB数据,而HTTPGETCLOB是一个标量函数,它将使用GET方法来检索作为CLOB的资源表示形式。

除了HTTP方法功能之外,还提供了一些辅助功能来执行URL编码和解码以及base64编码和解码。 URL规范 (RFC 1738)定义了一组特殊字符,需要将这些特殊字符替换为转义序列(例如,如果用于URL的查询字符串中)。 辅助功能URLENCODEURLDECODE执行URL编码和解码。 Base64编码通常用于将二进制数据编码为Web上的文本数据。 提供了辅助函数BASE64ENCODEBASE64DECODE ,用于对base64数据进行编码和解码。

表1显示了本文中使用的HTTP函数的签名。

表1.使用的HTTP函数的签名
功能名称
httpGetBlobVerbose 输入参数 输入参数类型
URL VARCHAR(2048)
HTTPHEADER CLOB(10K)
输出栏 输出列类型
RESPONSEMSG BLOB(2G)
RESPONSEHTTPHEADER CLOB(10K)
httpGetBlob 输入参数 输入参数类型
URL VARCHAR(2048)
HTTPHEADER CLOB(10K)
返回类型
BLOB(2G)
urlEncode 输入参数 输入参数类型
VALUE VARCHAR(2048)
ENCODING VARCHAR(20)
返回类型
VARCHAR(4096)

对于URLENCODE函数, VALUE参数是原始字符串,而ENCODING参数用于指定编码。 如果为VALUE参数指定NULL ,则使用UTF-8。 RFC 3986建议使用UTF-8。

有关此示例中未使用的HTTP函数的列表,请参见参考资料小节中的白皮书。 您可以在以下位置找到集成文件系统下的HTTP函数的源代码:

/QIBM/ProdData/OS/SQLLIB/bin/systools_java_source.jar。

检索DB2 for i博客条目

在本节中,提供了一个示例来说明如何使用HTTP函数从Web服务检索数据以及如何在关系数据库中处理检索到的数据以更好地使用。

图1显示了我们想从示例中的查询中检索到的结果集,该结果集是从DB2 for i Blog获得所需的条目。 结果集包含发布日期,作者,标题,响应(评论)数以及标识博客文章的URL。

图1. XMLTABLE结果集
XMLTABLE结果集

此示例中的第一步是查阅需要访问的Web服务的应用程序编程接口(API)文档。 您可以参考该文档DB2对我博客 .The文件告诉我们,HTTP GET方法可以用来在特定时间后返回所有文章的列表,并为这个URL看起来应该如示例1所示。

示例1:URL格式
http://db2fori.blogspot.com/feeds/posts/default?published-min=rfc3339_timestamp

在示例1中, rfc3339_timestamp是RFC 3339标准描述的格式的时间戳。 RFC 3339时间戳的示例看起来像“ 2013-05-12T23:20:50.52Z”。

为了构造正确格式的时间戳,使用示例2中所示的UDF。 使用UDF使构造URL的代码更易于阅读。

例子2.创建一个rfc3339时间戳的函数
CREATE FUNCTION rfc3339_ts_format(in_time TIMESTAMP) 
RETURNS VARCHAR(26) 
LANGUAGE SQL
SET OPTION DATFMT=*ISO
 RETURN CONCAT( CONCAT(CAST(DATE(in_time) AS CHAR(10)), 
                        'T' ),
                CHAR(TIME(in_time), JIS));

现在可以使用示例3中所示SQL表达式来构造URL。在URL中指定参数数据时,最佳实践是利用SYSTOOLS.URLENCODE标量函数。 该功能可以识别特殊字符,并在需要时添加转义字符。

例子3.构造URL
CONCAT(CONCAT('http://db2fori.blogspot.com/feeds/posts/default?', 'published-min='), 
       SYSTOOLS.URLENCODE(rfc3339_ts_format(CURRENT_TIMESTAMP - 6 MONTHS),'UTF-8'))

下一步是设置请求标头。 DB2为我提供的XML内置功能使在SQL中处理XML数据变得容易。 博客Web服务支持使用基于XML的Atom格式检索数据。 因此,对请求标头进行了编码,以便响应采用Atom格式,如示例4所示。

例子4.原子请求头
<httpHeader>
    <header name="Accept" value="application/atom+xml"/>
</httpHeader>

此时,可以使用HTTPGETBLOBVERBOSE表函数检索XML响应消息。 示例5显示了查询语句。

示例5.查询以检索包含博客文章的提要
SELECT 
   XMLPARSE(DOCUMENT rs.responsemsg) msg,
   rs.responsehttpheader 
 FROM TABLE(
  SYSTOOLS.HTTPGETBLOBVERBOSE(
    -- URL -- 
CONCAT(CONCAT('http://db2fori.blogspot.com/feeds/posts/default?','published-min=' ),
    SYSTOOLS.URLENCODE(
       rfc3339_ts_format(CURRENT_TIMESTAMP - 6 MONTHS), 
       'UTF-8'
    )),

    -- Header --- 
    '<httpHeader>
     <header name="Accept" value="application/atom+xml"/>
    </httpHeader>')
) rs;

示例5中做出了一些重要的决定。

  • 响应消息从表函数作为BLOB 。 通常,将BLOB数据类型用于序列化XML数据而不是CLOB是最佳实践,因为它避免了数据的字符集与XML文档中的编码声明不匹配的问题。
  • 在SELECT语句的列列表中,使用XMLPARSE函数将BLOB转换为XML值。 XML数据类型可以与SQL和XML函数(例如XMLTABLE ,这将在本示例的后面进行演示。
  • 在此查询中使用详细表函数,而不是标量函数。 最初测试Web服务时,如果可以检查响应HTTP标头,则通常更容易调试问题。

示例2中的查询结果集如图2所示RESPONSEHTTPHEADER列包含HTTP响应代码"200" ,指示请求成功。

图2.结果集
结果集

MSG列返回的XML结果的简化内容如示例6所示。

例子6. MSG结果集列的详细信息
<?xml-stylesheet href="http://www.blogger.com/styles/atom.css" 
type="text/css"?>
<feed xmlns="http://www.w3.org/2005/Atom" 
    xmlns:openSearch=http://a9.com/-/spec/opensearchrss/1.0/
    xmlns:blogger="http://schemas.google.com/blogger/2008"
    xmlns:georss="http://www.georss.org/georss"
    xmlns:gd="http://schemas.google.com/g/2005"
    xmlns:thr="http://purl.org/syndication/thread/1.0">
   <entry>
      <published>2013-07-22T14:57:00.000-05:00</published>
      <title type="text">A Competitive Advantage? It's all about the data. 
      </title>
      <link rel="alternate" type="text/html"
           href="http://db2fori.blogspot.com/2013/07/a-competitive-advantage-its-all-about.html" 
           title="A Competitive Advantage? It's all about the data."/> 
      <author>
        <name>Mike Cain</name>
        <uri>http://www.blogger.com/profile/01481223716996299215</uri>
        <email>noreply@blogger.com</email>
      </author>
      <thr:total>0</thr:total>
   </entry>
   <entry>…</entry>
   ……
</feed>

RESPONSEHTTPHEADER列返回的XML结果的简化内容如示例7所示。

示例7. RESPONSEHTTPHEADER结果集列的详细信息
<?xmlversion="1.0"encoding="UTF-8"?> 
<httpHeaderresponseCode="200">
    <responseMessage>OK</responseMessage>
    <header name="GData-Version" value="1.0"/>
    <header name="HTTP_RESPONSE_CODE" value="HTTP/1.1 200 OK"/>
    <header name="Transfer-Encoding" value="chunked"/>
    <header name="Vary" value="Accept, X-GData-Authorization, GData-Version"/>
    <header name="Date" value="Thu, 01 Aug 2013 09:19:15 GMT"/>
    <header name="X-XSS-Protection" value="1; mode=block"/>
    <header name="Expires" value="Thu, 01 Aug 2013 09:19:15 GMT"/>
    <header name="Last-Modified" value="Mon, 22 Jul 2013 19:57:19 GMT"/>
    <header name="Content-Type" value="application/atom+xml; charset=UTF-8"/>
    <header name="Server" value="GSE"/>
    <header name="X-Content-Type-Options" value="nosniff"/>
    <header name="Cache-Control" value="private, max-age=0, must-revalidate, no-transform"/>
</httpHeader>

示例6中的XML文档不是很有帮助; 我们需要的是能够将XML文档分解或分解为关系数据库表, 如图1所示,以便更好地参考。

Web服务提供的文档说明了响应消息中XML文档的结构。 确定此信息的另一种方法是检查图2的MSG列中显示的文档。 在检查了示例文档之后,可以构造用于定位XML文档中有趣部分的XPath表达式。

XMLTABLE函数可用于创建所需的结果集,如示例8所示。为简单起见,图8中使用了标量HTTPGETBLOB函数,而不是示例5中使用的HTTPGETBLOBVERBOSE表函数。 可以将这个查询写为HTTPGETBLOBVERBOSE表函数和X MLTABLE函数之间的HTTPGETBLOBVERBOSE 。 但是,此示例不使用HTTP响应标头,因此,标量函数就足够了。

例子8.使用XMLTABLE函数将XML转换为关系结果集
SELECT published, author, title, responses, url
FROM
XMLTABLE(
  --------------- Namespace declarations -------------
  XMLNAMESPACES(
      DEFAULT 'http://www.w3.org/2005/Atom',
      'http://purl.org/syndication/thread/1.0' AS "thr"
  ),
  --------------- Row expression --------------------
  'feed/entry' 
  --------------- Initial context -------------------
  PASSING 
    XMLPARSE(DOCUMENT 
      SYSTOOLS.HTTPGETBLOB(
       -- URL --
       CONCAT( CONCAT('http://db2fori.blogspot.com/',
          'feeds/posts/default?published-min='),
         SYSTOOLS.URLENCODE(
        RFC3339_TS_FORMAT(CURRENT_TIMESTAMP - 6 MONTHS),
        'UTF-8'
       )),

       -- header --
       '<httpHeader>
        <header name="Accept"
                   value="application/atom+xml"/>
        </httpHeader>'
        )
    )
  --------------- Result Set Columns ----------------
  COLUMNS
    published TIMESTAMP 
        PATH 'published',
    author VARCHAR(15) CCSID 1208 
        PATH 'author/name',
    title VARCHAR(100) CCSID 1208
        PATH 'link[@rel="alternate" and 
                   @type="text/html"]/@title',
    responses INTEGER 
        PATH 'thr:total',
    url       VARCHAR(4096) CCSID 1208
        PATH 'link[@rel="alternate" and 
                   @type="text/html"]/@href'
    ) RS
ORDER BY PUBLISHED DESC

XMLTABLE表函数具有几个重要组件。

XMLNAMESPACES声明用于定义将在XPath表达式中使用的名称空间。 本示例为XPath表达式中使用的所有不合格元素设置默认名称空间“ http://www.w3.org/2005/Atom”,并将前缀“ thr”绑定到名称空间“ http:// purl” .org / syndication / thread / 1.0”。

行表达式表示结果集将为每个“ feed / entry”元素包含一行。

PASSING子句定义用于评估行表达式的初始上下文。 在此示例中,在行表达式中使用的XPath表达式相对于从XMLPARSE函数返回的XML文档的根。

所述HTTPGETBLOB标量函数在内使用PASSING子句的表达来检索响应消息。 HTTPGETBLOB标量函数的参数与前面在图2中讨论的参数匹配。响应消息被解析为XML数据类型的实例(使用XMLPARSE函数),并作为XMLTABLE函数的参数提供。

COLUMNS子句定义了XMLTABLE函数产生的列。 每列都有一个名称,一个SQL数据类型和一个XPath表达式。 XPath表达式所标识的XML文档中的项目将转换为SQL数据类型,并分配给结果集的列。 路径表达式是相对于用于生成行的entry元素而言的。

示例8中的查询结果与图1中所示的结果集匹配。

结论

DB2 for i HTTP函数提供了一种从SQL语句访问Web资源的简便方法。 当与DB2 for i内置XML支持结合使用时,它们提供了将Web服务直接无缝集成到数据库中的能力。 本文提供了一个示例,展示了HTTP函数从Web服务检索数据的基本用法以及如何将XML数据分解为关系数据。

翻译自: https://www.ibm.com/developerworks/ibmi/library/i-incorporating-web-service/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值