在Struts2 RESTful插件POST请求中返回响应

穆罕默德丹麦汗

我已经从这里获取信息实现了Struts2 REST API

Struts2 Rest插件

有没有办法在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>

这符合所有的要求GETPOSTPUTUPDATE

将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.xmlhttp://localhost:8080/restdemoapplication/restdemo.json

对于POST请求,我确实要发布请求 在此处输入图片说明

您会看到我收到的回复。我写的发布方法上面写着名称create。我的身体中确实有数据,并且确实在create方法中获得了数据。

现在在帖子中,如我在多个示例中看到的

struts-reststuts2-rest-samplestruts2-rest-shopping-list

我不想像这些应用程序那样为发布请求返回响应。我想返回自己的回复,这将是一个状态代码和一条类似的消息

<?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设置为默认模板,但我不希望这样做,因为它将影响非静态请求。)

罗马C

您误解了struts2-rest-plugin使用的内容类型的概念。

内容类型

除了提供RESTful URL到Controller(Action)调用的映射之外,REST插件还提供了生成资源数据的多种表示形式的功能。默认情况下,插件可以返回以下内容类型的资源:

  • 的HTML
  • XML格式
  • JSON格式

此处没有任何配置,只需将内容类型扩展名添加到RESTful URL即可该框架将处理其余的工作。因此,例如,假设一个名为Movies的控制器和一个带有idof的电影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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章