开发者社区> 问答> 正文

oschina服务器端xml数据在ApiAction类中是如何生成的? : 配置报错

@红薯 你好,想跟你请教个问题: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是怎么实现的呢?谢谢!

展开
收起
kun坤 2020-06-04 11:54:45 526 0
1 条回答
写回答
取消 提交回答
  • 引用来自“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里做的权限控制就白做了。 ######非常感谢,已经按照您说的修改了,但是页面返回的数据格式好像不是xml,麻烦看一下我下面的跟帖!###### 一样用的啊! 你说的这种情况action仅仅是用来做一些权限控制之类的,然后forward到对应的模板,数据还是在toolbox里面取。 ###### @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不行呢? ######@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 指点啊!######回复 @tsl0922 : 谢谢,加了response.setContentType("text/xml;charset=UTF-8")终于成功!得给 @tsl0922 设置最佳答案!######回复 @27号 : +1 Content-Type 设置成 text/xml 就可以了######应该是response的content-type影响的。
    2020-06-05 13:14:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
如何运维千台以上游戏云服务器 立即下载
网站/服务器取证 实践与挑战 立即下载
ECS计算与存储分离架构实践 立即下载