【问题标题】:REST API plugin - use body instead of query string for parametersREST API 插件 - 使用正文而不是查询字符串作为参数
【发布时间】:2015-02-24 18:16:58
【问题描述】:

我以此为参考在 Struts2 上创建仅 REST 配置:

https://cwiki.apache.org/confluence/display/WW/REST+Plugin

我有一个模型,带有几个测试字段的收据:标题、正文。

目前要创建收据,我以这种方式发送请求:

POST /receipt/?body=new_body&title=new_title

它会为我创建一个包含传入的新正文和标题的收据。

这不起作用:

POST /receipt/
{
  "body": "new_body",
  "title": "new title"
}

这里有一些代码:

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

    <bean type="org.apache.struts2.rest.handler.ContentTypeHandler" name="jackson" class="org.apache.struts2.rest.handler.JacksonLibHandler"/>
    <constant name="struts.rest.handlerOverride.json" value="jackson"/>

    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
    <constant name="struts.devMode" value="true"/>
    <constant name="struts.rest.content.restrictToGET" value="false"/>
    <constant name="struts.rest.defaultExtension" value="json"/>
    <constant name="struts.rest.handlerOverride.EXTENSION" value="json"/>
    <constant name="struts.i18n.encoding" value="UTF-8"/>

    <constant name="struts.action.extension" value="xhtml,,xml,json,action"/>
    <constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper" />
    <constant name="struts.mapper.prefixMapping" value="/receipt:rest,:struts"/>

    <constant name="struts.convention.action.suffix" value="Controller"/>
    <constant name="struts.convention.action.mapAllMatches" value="true"/>
    <constant name="struts.convention.default.parent.package" value="receipto"/>
    <constant name="struts.convention.package.locators" value="controllers,actions"/>
</struts>

ReceiptController.java:

public class ReceiptController implements ModelDriven<Object> {

    private ReceiptManager receiptManager = new ReceiptManager();
    private String id;
    private Receipt model = new Receipt();
    private Collection list;

    public Object getModel()
    {
        return (list==null ? model : list);
    }

    public HttpHeaders create()
    {
        receiptManager.save(model);
        return new DefaultHttpHeaders("create");
    }


    public HttpHeaders show()
    {
        model = receiptManager.find(id);
        return new DefaultHttpHeaders("show");
    }

    public HttpHeaders update()
    {
        receiptManager.save(model);
        return new DefaultHttpHeaders("update");
    }

    public HttpHeaders destroy()
    {
        model = receiptManager.destroy(id);
        return new DefaultHttpHeaders("destroy");
    }

    public HttpHeaders index()
    {
        list = receiptManager.list();
        return new DefaultHttpHeaders("index").disableCaching();
    }

    public String getId()
    {
        return id;
    }

    public void setId(String id)
    {
        this.id = id;
    }
}

它应该像我想要的那样工作,还是插件就是这样工作的?

【问题讨论】:

  • 你是如何发出 POST 请求的?
  • 什么意思?比如邮递员,我在问题中提到了如何。

标签: java json rest struts2 struts2-rest-plugin


【解决方案1】:

我猜邮递员在请求正文中发送 JSON 并设置内容类型application/json。如果将json 拦截器添加到堆栈中,Struts 可以解析请求。

<interceptor-stack name="myStack">
    <interceptor-ref name="json"/>
    <interceptor-ref name="myInterceptor"/>
    <interceptor-ref name="defaultStack"/>
</interceptor-stack>

JSON Plugin中"json"拦截器的描述:

如果使用了拦截器,action会从请求中的JSON内容中填充,这些是拦截器的规则:

  • “内容类型”必须是“应用程序/json”
  • JSON 内容必须格式正确,语法见json.org。
  • 对于必须填充的字段,操作必须具有公共“setter”方法。
  • 支持的填充类型包括:基元 (int,long...String)、日期、列表、地图、基元数组、其他类(稍后会详细介绍)和其他类的数组。
  • JSON 中要填充到列表或映射中的任何对象都将是 Map 类型(从属性映射到值),任何整数都将是 Long 类型,任何十进制数都将是类型Double 和任何 List 类型的数组。

资源:

【讨论】:

  • 太好了,谢谢!你怎么知道这一切?一般来说,我只是一个使用 struts 和 java/tomcat 开发的初学者。你有什么可以建议的参考点吗?任何描述这一切的好书?谢谢
  • 你应该阅读this的答案,我相信你会找到很多有用的信息。
  • 显然帖子已被删除。请问可以在这里发信息吗?谢谢
  • 我已添加指向此答案的链接。享受吧。
猜你喜欢
  • 2018-06-21
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 2016-04-25
相关资源
最近更新 更多