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',

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