当前位置: 首页 > 知识库问答 >
问题:

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

茅才
2023-03-14

我从这里获取信息实现了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>

这将满足所有请求,包括获取、发布、放置、更新。

在将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);
}

这是返回类型为String的POST请求方法:

public String create(){
    System.out.println(envision2Data.toString());
    return "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <Status><code>200</code><message>Success</message></Status>";
}

我得到了完美的get响应,如果我发送xml或json请求,我会基于扩展获取xml和json。like<代码>http://localhost:8080/restdemoapplication/restdemo.xml,http://localhost:8080/restdemoapplication/restdemo.json

你可以看到我得到的回应。我为post编写的方法写在上面,名为create。我在正文中确实有数据,我在create方法中确实完美地获得了数据。

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

struts rest,stuts2 rest示例,struts2 rest购物清单

我不想像这些应用程序那样返回post请求的响应。我想返回我自己的响应,它将是一个状态码和一条这样的消息

<?xml version="1.0" encoding="UTF-8"?> <Status><code>200</code><message>Success</message></Status>

经过一些调试,我发现struts2 rest插件中的默认ContentTypeHandlerManager将xhtml作为默认模板。而它应该是XML或JSON。

我想退货

 code : 1xx,2xx,4xx
 message: Success, Fail

在接受POST请求时使用XML或JSON。

(这是应用程序同时接受非restful请求和restful请求。我可以将xml或json作为默认模板,但我不想这样做,因为它会影响非restful请求。)


共有2个答案

施权
2023-03-14

这就是我需要的解决方案。我所做的是

@Override
public Object getModel() {
        <!-- Changed name of the object overhere to mainObject-->
    if (mainObject == null) {
        if (responseObject != null) {
            return responseObject;
        } else if (mainObject != null) {
            return mainObject;
        }
        mainObject = new mainObject();
    }
    return mainObject;
}

然后在内容类型处理程序中。内容类型处理程序是自定义的,因为我使用Jackson将JSON转换为对象,反之亦然。

if (paramObject instanceof MainObject) {
        MainObject mainObject = (MainObject) paramObject;
        writer.write(mapper.writeValueAsString(mainObject));
} else if (paramObject instanceof ResponseObject) {
        ResponseObject responeObject = (ResponseObject) paramObject;
        writer.write(mapper.writeValueAsString(responeObject));
} 
祖奇
2023-03-14

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

内容类型

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

  • HTML
  • XML
  • JSON

这里没有任何配置,只需将内容类型扩展添加到RESTful URL。框架将处理其余部分。因此,例如,假设一个名为“Movies”的控制器和一个id为“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实现来扩展功能。阿帕奇。支柱2。Rest处理程序。ContentTypeHandler并在系统中注册它们。

插件服务器按内容类型请求,可以作为操作扩展提供,也可以提供数据类型。传入数据类型由“内容类型”标题定义,传出数据类型由“接受”标题定义。

要发出返回数据的请求,您需要向Struts配置文件中添加一个常量。xml:

<constant name="struts.rest.content.restrictToGET" value="false"/>

演示应用程序随名为struts2-rest-show case的Struts发行版一起提供。在上面添加一个常量后,您可以使用一些超文本传输协议客户端测试应用程序。

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

 类似资料:
  • 我见过龙卷风文档和示例,其中self.write方法被广泛用于在超文本标记语言上呈现一些值,其中POST请求在处理程序中运行。但是我找不到关于如何将响应返回给客户的清晰信息。 例如,我正在从我的客户端调用Tornado服务器上的POST请求。接受post请求的代码为: 有了这个,我可以找到cbtp的值,有了,我可以用HTML打印它。但是,相反,我想以JSON格式将这个值返回给客户机,比如我想知道如

  • 所以我想打印响应的结果,然后使用gson为模型生成数据,但响应永远不会得到返回,因为调用了onResponse。! 如果你注意到Logcat,日志。我的回答没有显示。。!?但是在使用该请求的活动的onSuccess中,它通常会显示日志,但是如果日志包含响应对象,它不会显示哪个非常奇怪,也没有任何意义。。!? Logcat公司 我尝试使用具有相同url和参数的PostMan测试请求,它通常返回jso

  • 我必须做一个帖子,但我得到错误405 在本网站->http://177.66.89.34:8079/transparencia/#我需要迭代页面顶部的2个下拉菜单的选项。 首先,我会在“escolha o exercício”旁边加上选项:然后,我会在“escolha a entidade”旁边加上选项: 用下面的代码,我在“EscolhaoExercício:”上面写了一篇文章 我希望在pars

  • 在我的spring boot应用程序中,我想用响应体返回不同类型的响应代码。 这是我的Rest控制器,我想根据不同的条件返回不同的响应。但它仅在满足用户NIC条件时返回条件。如果将用户添加到数据库,它会抛出。 我想根据请求返回响应。

  • 我试图使超文本传输协议后请求获得api令牌。如果成功,它应该返回访问令牌、令牌类型(承载)和expires_in的字符串值。 我的代码是一个通用的,我希望看到它能工作。但是由于某些原因,它抛出了一个例外400“远程服务器返回了一个错误。错误请求”。我一直在尽一切努力修复这个问题,但结果没有改变。 当我调试代码并在输出窗口中看到结果时,数据流有一个异常,说“这个流不支持查找操作” 我怀疑这是由于po

  • 我有一个简单的helper来发送post请求并返回结果,它应该与自定义构建的API进行通信,所有的工作都离不开一个特定的URL。 我的helper方法如下所示(使用RestSharp) 我要求如下: 非常感谢任何帮助。