我已经从这里获取信息实现了Struts2 REST API
有没有办法在Struts2的Restful插件中返回自定义响应。我做了所有必要的更改,例如
struts.rest.content.restrictToGET = false
从这个问题。我仍然遇到这个错误
No result defined for action `com.web.Controller.RestDemoController` and result create,
如果我不添加上面的行,我仍然会得到相同的响应。
这是我在struts.xml
以下操作中提供的操作:
<action name="restdemo" class="com.web.Controller.RestDemoController">
<interceptor-ref name="customRestStack"></interceptor-ref>
</action>
这符合所有的要求GET
,POST
,PUT
,UPDATE
。
将post方法的返回类型从HttpHeader更改为String后,我仍然遇到相同的错误
Error 404: No result defined for action com.web.Controller.RestDemoController and result <?xml version="1.0" encoding="UTF-8"?> <Status><code>200</code><message>Success</message></Status>
这是我为POST编写的代码:
public HttpHeaders create(){
System.out.println(envision2Data.toString());
return new DefaultHttpHeaders("create").withStatus(200);
}
这是带有返回类型的POST请求方法String
:
public String create(){
System.out.println(envision2Data.toString());
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <Status><code>200</code><message>Success</message></Status>";
}
如果我发送xml或json请求,我会得到完美的响应,我会基于扩展名获取xml和json。像http://localhost:8080/restdemoapplication/restdemo.xml
,http://localhost:8080/restdemoapplication/restdemo.json
您会看到我收到的回复。我写的发布方法上面写着名称create。我的身体中确实有数据,并且确实在create方法中获得了数据。
现在在帖子中,如我在多个示例中看到的
我不想像这些应用程序那样为发布请求返回响应。我想返回自己的回复,这将是一个状态代码和一条类似的消息
<?xml version="1.0" encoding="UTF-8"?> <Status><code>200</code><message>Success</message></Status>
经过一些调试后,我发现DefaultContentTypeHandlerManager
在struts2-rest-pluginxhtml
中将其视为默认模板。虽然它应该是XML或JSON。
我想回来
code : 1xx,2xx,4xx
message: Success, Fail
受理POST请求时,使用XML或JSON格式。
(这是应用程序同时招待非静态请求和静态请求。我可以将xml或json设置为默认模板,但我不希望这样做,因为它将影响非静态请求。)
您误解了struts2-rest-plugin使用的内容类型的概念。
内容类型
除了提供RESTful URL到Controller(Action)调用的映射之外,REST插件还提供了生成资源数据的多种表示形式的功能。默认情况下,插件可以返回以下内容类型的资源:
- 的HTML
- XML格式
- JSON格式
此处没有任何配置,只需将内容类型扩展名添加到RESTful URL即可。该框架将处理其余的工作。因此,例如,假设一个名为Movies的控制器和一个带有
id
of的电影superman
,则以下URL都将命中http://my.company.com/myapp/movies/superman http://my.company.com/myapp/movies/superman.xml http://my.company.com/myapp/movies/superman.xhtml http://my.company.com/myapp/movies/superman.json
注意,这些内容类型也支持作为传入数据类型。而且,如果需要,您可以通过编写自己的实现
org.apache.struts2.rest.handler.ContentTypeHandler
并将其注册到系统中来扩展功能。
插件服务器按内容类型(作为操作扩展或通过提供数据类型)进行请求。传入数据类型由"Content-Type"
标头定义,传出数据类型由"Accept"
标头定义。
为了使POST
请求返回数据,您需要在Struts配置文件中添加一个常量struts.xml
:
<constant name="struts.rest.content.restrictToGET" value="false"/>
名为的Struts发行版提供了演示应用程序struts2-rest-showcase
。在上面添加一个常量之后,您可以使用一些http客户端测试该应用程序。
POST http://localhost:8080/orders
Accept: application/json
Content-Type: application/json
{
"id":"23423423",
"clientName":"Roman C",
"amount": 1000
}
-- response --
201
Content-Language: en-US
Content-Length: 54
Content-Type: application/json;charset=UTF-8
Date: Sat, 07 Oct 2017 20:44:39 GMT
ETag: -735433458
Location: http://localhost:8080/orders/23423423
{"amount":1000,"clientName":"Roman C","id":"23423423"}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句