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()));

Несмотря на то, что я решил свою проблему, я хотел бы знать, есть ли другие способы сделать это.

Другие вопросы по тегам