GWT JSONP с постом не получить - PullRequest
4 голосов
/ 25 июля 2011

У меня есть веб-сервис в виде `http://....../methodName

Возвращает результат jsonp, такой как:

methodName(["a":"a", "b":"b"]) 

GWT предоставляет класс JsonpRequestBuilder для анализа jsonp.

  JsonpRequestBuilder rb = new JsonpRequestBuilder();

  rb.setCallbackParam("callback");

  rb.requestObject("http://...../methodName", new AsyncCallback<TestJS>(){
  ...
});

Эта структура делает запрос к URL: "http://...../methodName/?callback=__gwt_jsonp_P0.onSuccess".

Мой веб-сервис возвращает функцию обратного вызова с methodName, а не с __gwt_json ..... Поэтому gwt не смог создать объект JavaScriptObject из этого ответа. Также JsonpRequestBuilder работает с GET, а не POST.

Как этого добиться: отправка запросов с помощью POST и изменение имени обратного вызова GWT по умолчанию.

Ответы [ 2 ]

8 голосов
/ 25 июля 2011

JSONP будет НЕ работать с POST. Между прочим, это не ограничение GWT.

JSONP по сути включает в себя файл javascript с вашего сервера. Поэтому, когда вы делаете вызов JSONP, в DOM добавляется временный тег.

Теперь тег <script> всегда может сделать запрос GET. Это вещь браузера, и GWT ничего не может с этим поделать.

Если вы хотите сделать междоменный вызов POST, вам нужно выбрать один из следующих вариантов (и они не имеют никакого отношения к GWT)

  • Использовать Flash плюс файл crossdomain.xml, разрешающий междоменные сообщения
  • Используйте Cross Origin Resource Sharing или CORS. Обратите внимание, что это поддерживается только в современных браузерах
  • Использование прокси-сервера в вашем домене
0 голосов
/ 25 июля 2011

К сожалению, JsonP работает не так. Запросы выполняются путем добавления тега на страницу, а результаты передаются в функцию, обернутую вокруг данных - в вашем случае, __gwt_jsonp_P0.onSuccess.

На имя обратного вызова нельзя повлиять, по крайней мере, при использовании JsonpRequestBuilder - система должна учитывать тот факт, что вы можете отправлять несколько запросов одновременно, возможно, даже на разные конечные точки. Конечная точка JsonP, которая не позволяет вызывающей стороне настраивать имя функции обратного вызова, очень необычна, а еще более странной является конечная точка, ожидающая вызовов JsonP, ожидающая невозможного POST.

Вы можете реализовать свой собственный код на стороне клиента JsonP, используя тип ScriptElement и зарегистрировав свой собственный глобальный обратный вызов для вызова вашего Java-кода GWT.

Просмотрите документы API для веб-службы и выясните, возможно, существует ли лучший способ связи с ним, возможно, с использованием прокси-сервера на вашем собственном сервере, что позволяет полностью избежать междоменной проблемы.

...