oschina服务器端xml数据在ApiAction类中是如何生成的?

FoxHu 发布于 2013/07/26 15:38
阅读 442
收藏 1

@红薯 你好,想跟你请教个问题:oschina android手机客户端访问api获取的信息是xml格式数据,如新闻列表api是http://www.oschina.net/action/api/news_list,以前听你讲过oschina服务器端生成xml用的是velocity模板,但是aciton和vm走的是两条路,web app页面需要的数据可以通过在toolbox中配置然后在模板页面中获取,但是返回给手机客户端的xml数据在ApiAction类中news_list()方法中是怎么将数据填充到*.vm xml模板中的呢?难道也是在toolbox中配的,但是它的url不符合全局URLMappingFilter啊,还请老大赐教!oschina是怎么实现的呢?谢谢!

加载中
0
tsl0922
tsl0922

引用来自“FoxHu”的答案

@tsl0922 非常感谢,按照您的思路,比如请求的url地址为:http://localhost:8080/action/api/docDetail?id=50
我的ApiAction是这样写的

import java.io.IOException;
import javax.servlet.ServletException;
import my.mvc.RequestContext;

public class ApiAction extends BaseAction {
	public void docDetail(RequestContext ctx) throws ServletException, IOException{
		String docId = ctx.param("id", "");//对应doc的id
		System.out.println("docId="+docId);
		ctx.forward("/doc/xml/docDetail/"+docId);//请求转发给docDetail.vm
		//ctx.redirect("/doc/xml/docDetail/"+docId);
	}
}
但是提示找不到页面文件,如果用ctx.redirect就是正常的,同时地址栏地址发生了变化。为什么我用forward不行呢?

默认情况下,forward是不会被filter拦截的(需要配置),也就是说URLMappingFilter在这里是不起作用的,所以你的forward路径应该改成这样:

ctx.forward("/doc/xml/docDetail?docId="+docId);

这里不能用redirect哦,不然你的action还有什么意义呢?

还有,模板文件最好放到WEB-INF目录下,作为API不应该让用户可以直接访问到,不然你在action里做的权限控制就白做了。

FoxHu
FoxHu
非常感谢,已经按照您说的修改了,但是页面返回的数据格式好像不是xml,麻烦看一下我下面的跟帖!
0
tsl0922
tsl0922

一样用的啊!

你说的这种情况action仅仅是用来做一些权限控制之类的,然后forward到对应的模板,数据还是在toolbox里面取。

0
FoxHu
FoxHu

@tsl0922 非常感谢,按照您的思路,比如请求的url地址为:http://localhost:8080/action/api/docDetail?id=50
我的ApiAction是这样写的

import java.io.IOException;
import javax.servlet.ServletException;
import my.mvc.RequestContext;

public class ApiAction extends BaseAction {
	public void docDetail(RequestContext ctx) throws ServletException, IOException{
		String docId = ctx.param("id", "");//对应doc的id
		System.out.println("docId="+docId);
		ctx.forward("/doc/xml/docDetail/"+docId);//请求转发给docDetail.vm
		//ctx.redirect("/doc/xml/docDetail/"+docId);
	}
}
但是提示找不到页面文件,如果用ctx.redirect就是正常的,同时地址栏地址发生了变化。为什么我用forward不行呢?

0
FoxHu
FoxHu
@tsl0922 按照您的方法修改如下:
public class ApiAction extends BaseAction {
	public void docDetail(RequestContext ctx) throws ServletException, IOException{
		String docId = ctx.param("id", "");//对应doc的id
		System.out.println("docId="+docId);
		ctx.forward("/WEB-INF/www/doc/xml/docDetail.vm?id="+docId);//请求转发给docDetail.vm
	}
}
docDetail.vm模板文件如下:
#set($layout="shell/xmllayout.vm")
#set($docid = $link.param('id',0))
#set($doc=$doc_tool.detail($docid))
<diabetes>
	<doc>
        <id>$!{doc.id}</id>
        <title>$!{doc.title}</title>
        <author>$!{doc.author}</author>
        <source>$!{doc.source}</source>
    </doc>
</diabetes>
其中布局模板xmllayout.vm
<?xml version="1.0" encoding="UTF-8"?>
${screen_content}
页面执行结果为

查看源码为:

为什么返回的页面形式跟oschina不一样,好像不是xml格式,oschina的一篇详细新闻的xml返回格式截图

这是什么原因的,还请 @tsl0922 指点啊!
FoxHu
FoxHu
回复 @tsl0922 : 谢谢,加了response.setContentType("text/xml;charset=UTF-8")终于成功!得给@tsl0922 设置最佳答案!
tsl0922
tsl0922
回复 @27号 : +1 Content-Type 设置成 text/xml 就可以了
27号
27号
应该是response的content-type影响的。
返回顶部
顶部