cetia4 1.1文档-2.2 Web Service 访问

来源:互联网 发布:linux怎样怎样连接外网 编辑:程序博客网 时间:2024/06/05 03:13

2.2 Web Service 访问
Cetia4 REST framework的一个主要目标就是既可以响应传统的web请求,也可以相应web service请求而不必复制公共的代码。在很多情况下,这个目的可以轻易的实现;但是在一些情况下这些代码和方法需要一些调整(例如:建立不同的render方法应对各种请求)。暂时,我们关注理想的情况。
  上面定义Render方法也可以用于希望得到xml格式响应的web service 请求。
这可以使用上一节所说的相对路径轻易的简单的实现。在web service 请求,不同的视图被选中,像前面的例子,默认的目录/WEB-INF/xml ( 代替/WEB-INF/html ),默认的文件后缀是jspx(因为现在生产xml文件)。所以,现在的视图就是/WEB-INF/xml/topics/display_topic.jspx.

Cetia4 framework区分传统的web request和web service请求是依据http accept header。http accept header 的值是"text/html" 或者是含有"html" ,那么就判定是一个传统的web请求(视图 /WEB-INF/html将被返回);相反,http accept header 的值是"application/xml"或者 "text/xml",就断定web service请求(视图 /WEB-INF/xml将被返回)。所以,对于web service 客户端来说,设置正确的http header很重要,否则的话,请求将不能按照所要的正确的响应(响应的类型也可以通过特别的http 参数设置,我们将在下面讨论)。
  
再者,如果你想测试jspx文件,下面是他的代码:display_topics.jspx.

<?xml version="1.0" encoding="ISO-8859-1"?>
<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page">
<jsp:directive.page contentType="application/xml" session="false"/>
<topics>
Hello REST World!
</topics>
</jsp:root>
在<jsp:directive>标签中的session="false"属性是很重要的,因为web service请求是无状态的,至少在实现上,所以我们没必要创建不必要的session(在各个request之间保存状态)。
我们如何测试 web service 实现呢?
 一种非常有用的选择是使用Jakarta Commons HttpClient的库。

另一种简单的有局限的选择是使用在com.acsinet_solutions.cetia4.http 包中的httpClient的包装类,可以非常快速和简单的测试效果。下面的代码实现了简单的“http://localhost:8080/forum/topics”请求。其中,SimpleHttpCommandProcessor 设置了http header为"application/xml",所有xml响应将会在标准输出上显示。

package com.example.forum.test;
import com.acsinet_solutions.cetia4.http.*;
import java.io.OutputStream;
public class WebServiceClient
{
public static void main( String[] args ) throws Exception
{
SimpleHttpCommandProcessor processor =
new SimpleHttpCommandProcessor();
// Create a GET request aimed at the topics servlet.
processor.setBase( "http://localhost:8080/forum" );
HttpCommand command = new GetCommand( "/topics" );
// Send the request and print the response to standard output.
OutputStream ostream = System.out;
int statusCode = processor.execute( command, ostream );
System.out.println( statusCode );
}
}
显然,这个单独的java程序必须对应于一个运行的servlet 容器。如果一个 web service 没有被创建,将会发生错误。GET请求可以使用Post ,put ,delete代替,相应的改变GetCommand 为PostCommand, PutCommand或者 DeleteCommand。
这些类可以满足基本的http请求需要,对于灵活多变的需求,可以使用如Jakarta Commons HttpClient这样的库代替(安装和使用非常方便)。