Ajax-вызов GenericPortlet.serveResource() в WebSphere Portal 6.1
Я пытаюсь вызвать метод serveResource() портлета, используя jQuery/ajax. Мне удалось получить простой портлет JSR-286, работающий в Pluto 2.0, который может читать строку JSON из тела запроса, создавать объект Java из JSON и возвращать toString() этого объекта в мой вызывающий JavaScript. Однако когда я развертываю * тот же портлет в WebSphere Portal 6.1, тело запроса к моменту достижения serveResource() становится пустым.
Я предполагаю, что упускаю что-то базовое / фундаментальное, поэтому любой совет был бы оценен. Я думаю, что я мог бы заставить мой пример работать, если бы я вставил строку JSON в параметры URL, но предпочел бы пока избегать такого подхода, если только у меня нет причины, по которой мой нынешний подход "плохой".
Редактировать: * Чтобы быть более точным, я развернул тот же портлет на WAS7, на котором работает WSRP Producer и использует портлет через WebSphere Portal 6.1.
Фрагмент Javascript:
function ajaxPost() {
var url = "<%= testServiceURL %>";
var current = $("input.current").val();
$.ajax(
{
url: url,
contentType: 'application/json; charset=utf-8',
dataType: 'html',
data: "{data: " + current + "}",
type: 'POST',
success: testSuccess,
error: testError
}
);
$("div.trace").append("ajax post fired<br />");
}
function testSuccess(data, textStatus, XMLHttpRequest)
{
$("div.trace").append("testSuccess(): " + data + "<br />");
}
Фрагмент портлета:
public class TestPortlet extends GenericPortlet {
...
@Override
public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException {
String res = "Failed to read body";
boolean bodyRead = true;
StringBuffer sb = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
line = reader.readLine();
while (line != null) {
sb.append(line);
line = reader.readLine();
}
reader.close();
} catch (Exception e) {
bodyRead = false;
}
Foo f = null;
if (bodyRead) {
try {
Gson gson = new Gson();
f = gson.fromJson(sb.toString(), Foo.class);
res = "Received: " + f.toString();
} catch (Exception e) {
res = "Failed to convert body into Foo: '" + sb.toString() + "'";
}
}
response.setContentType("text/html");
response.getWriter().println(res);
}
}
2 ответа
Наконец-то все заработало... вроде.
Изменив параметр contentType в моем вызове ajax на "application/x-www-form-urlencoded" (и поиграв с разными способами представления моих данных), теперь мои данные доступны в теле сообщения в моей среде WebSphere, хотя и в Форма параметра URL в отличие от JSON.
К сожалению, выполнение этого изменения привело к нарушению функциональности в Плутоне. Тело запроса в этой среде теперь пусто.
Теперь нужно либо изменить код для извлечения данных из request.getParameter() (который, я считаю, работает в обеих средах с моим изменением, но требует дополнительного тестирования), либо найти contentType, который приведет к заполнению тела запроса в обеих средах.
Когда вы отправляете запрос JSON, dataType должен быть JSON.
dataType: 'JSON',