2014-12-28 54 views
2

我用這個作爲參考來對Struts2的創建REST只配置:REST API插件 - 用身體代替查詢字符串參數

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; 
    } 
} 

難道這就是工作,我希望它,或只是如何插件作品?

+0

你怎麼做一個POST請求? –

+0

你是什麼意思?比如郵遞員,我在這個問題上提到了如何。 –

回答

2

我想那個郵遞員在請求的主體中發送JSON,並設置內容類型application/json。如果您將攔截器添加到堆棧,Struts可以解析請求。

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

JSON Plugin"json"攔截的描述:

如果使用攔截器,該動作將被從請求中的JSON內容填充,這些是攔截器的規則:

  • 的「內容類型」必須是
  • 的JSON含量必須良好地形成「應用程序/ JSON」,見json.org語法。
  • 對於必須填充的字段,操作必須具有公共「setter」方法。
  • 受支持的種羣類型有:基元(int,long ... String),日期,列表,映射,基元數組,其他類(稍後會詳細介紹)和其他類的Array。
  • JSON中的任何對象,即要填充到列表或映射中的類型將爲Map(從屬性映射到值),任何整數都將是Long類型,任何十進制數將是類型Double和任何List類型的數組。

資源:

+0

非常好,謝謝!你怎麼知道所有這些東西?我只是一個初學者,一般用struts和java/tomcat開發。有沒有可能建議的參考點?任何描述這一切的好書?謝謝 –

+1

你應該閱讀[this](http://stackoverflow.com/a/17898392/573032)答案,我相信你會找到很多有用的信息。 –

+0

顯然這個帖子被刪除了。你可以在這裏發佈信息嗎?謝謝 –