Liferay - рекомендуемый способ получения содержимого тела POST-запроса в методе serveResource.
Я отправляю POST-запрос из своего портлета Angular 8 Liferay 7.3 и пытаюсь получить его содержимое в
serveResource
метод в
MVCResourceCommand
класс.
Внешний вид JS выглядит так:
submit() {
let message = {
type: "form",
body: this.model
};
this.http.post<any>("http://my/url", message).subscribe(response => {
console.log(JSON.stringify(response));
})
}
Сообщение попадает в конечную точку, поэтому серверная часть хорошо настроена. На основе этого, этого и этого я также установил
"com.liferay.portlet.requires-namespaced-parameters=false"
свойство, чтобы пространства имен не были проблемой - так что, по сути, все точки в контрольном списке выполнены, и тело запроса должно быть доступно. В каждом сообщении, которое я читал до сих пор, говорится о получении информации о запросе с помощью
ParamUtil.getString(uploadRequest, "text");
, но я не уверен, как это должно работать, если тело является объектом JSON - я имею в виду, как мне получить значение, если тело POST выглядит так:
{
"firstVal": "abc",
"secondVal": "def",
"another": {
"objectVal1": 1,
"objectVal2": 2
}
}
2 ответа
Не ожидайте, что запросы, которые работают в любом другом фреймворке, будут работать и с Liferay. В этом случае вы должны отправить все в виде данных формы на сервер. К счастью, Liferay предоставляет небольшой служебный метод для этого случая использования. Используйте этот метод для полезной нагрузки вашего тела:
Liferay.Util.objectToFormData(payload)
Кроме того, если вы не предоставляете имена атрибутов в пространстве имен, вы также должны добавить это свойство в свой класс портлета:
Благодаря этому сообщению я дошел только до этого фрагмента кода, который извлекает тело как строку:
String body = PortalUtil.getHttpServletRequest(resourceRequest).getReader().lines()
.collect(java.util.stream.Collectors.joining(System.lineSeparator()));
Несмотря на то, что я решил свою проблему, я хотел бы знать, есть ли другие способы сделать это.