Возврат ответа в POST-запросе плагина RESTful для Struts2
Я реализовал Struts2 REST API, получив информацию здесь
Есть ли способ вернуть пользовательский ответ в плагин restful в Struts2. Я сделал все необходимые изменения, такие как
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
,
После изменения типа возвращаемого метода записи с 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
для запроса POST я делаю пост-запрос как
и вы можете увидеть ответ, который я получаю. Метод, который я написал для поста, написан выше с именем create. У меня есть данные в теле, и я получаю данные в методе создания отлично.
Теперь в посте, как я видел в нескольких примерах, как
Я не хочу возвращать ответ на почтовый запрос, как это делают эти приложения. Я хочу вернуть свой собственный ответ, это будет код состояния и подобное сообщение
<?xml version="1.0" encoding="UTF-8"?> <Status><code>200</code><message>Success</message></Status>
После некоторой отладки я обнаружил, что DefaultContentTypeHandlerManager
в struts2-rest-плагине посмотрим xhtml
как шаблон по умолчанию. Пока это должен быть либо XML, либо JSON.
я хочу вернуться
code : 1xx,2xx,4xx
message: Success, Fail
в формате XML или JSON, когда запрос POST принят.
(Это приложение поддерживает и запросы без перерыва, и запросы перезапуска. Я могу сделать xml или json шаблоном по умолчанию, но я не хочу, поскольку это будет влиять на запросы без перерывов.)
2 ответа
Вы неправильно поняли концепцию типов контента, используемых с struts2-rest-plugin.
Типы контента
В дополнение к обеспечению сопоставления вызовов RESTful URL с вызовами Controller ( Action), плагин 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.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"}
Итак, вот решение, которое мне было нужно. Что я сделал
@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;
}
а затем в обработчике типа контента. Обработчик Content-Type является пользовательским, так как я использовал Джексона для преобразования из 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));
}