JSONP с Jquery 1.9 и Джерси 2.5.1

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

Я разрабатываю серверное приложение с трикотажем 2.5.1 и клиентскую часть с HTML/CSS/JavaScript. Так что для этого отлично получилось, но нет, я спотыкаюсь. Я использую Media-Moxy в качестве своего сопоставления Java2Json.

@GET
@JSONP
@Path("search")
@Produces({MediaType.APPLICATION_JSON, "application/javascript"})
public String findByTagsAndBoundingBox(@QueryParam("topLeftLat") Double topLat...) {
    // do some work
    return json.toString();
}

Если я сейчас сделаю завиток в командной строке (см. Заголовок принятия в качестве запроса по документации трикотажа)

curl -X GET -H "Accept: application/javascript" "http://localhost:8181/xxxxx/xxxx/search?topLeftLat=59.93704238758132&topLeftLon=10.68643569946289&bottomRightLat=59.890573111743336&bottomRightLon=10.806941986083984&tag=Restaurant&callback=?"

Джерси доставляет контент, как и ожидалось (в JSONP):

callback([{"id":3134,"lon" .... }])

Но если я вызову это с помощью jquery следующим образом:

$.getJSON("http://localhost:8181/xxxx/yyyy/search?" + query + "&callback=?", function() {
     console.log( "success" );
})

Я всегда получаю ошибку

 parsererror, Error: jQuery110207164248435292393_1391195897558 was not called 

Я вижу, что ответ в браузере содержит правильный json, и я получаю код возврата 200. Но почему-то jQuery говорит, что что-то не так.

Любая помощь приветствуется, Даниил


person Daniel Gerber    schedule 31.01.2014    source источник


Ответы (2)


callback([{ должно было быть ?([{ с использованием URL-адреса, который вы использовали с CURL.

Назначение параметра обратного вызова в URL-адресе — указать имя функции обратного вызова, которая должна быть выполнена. jQuery, например, указал &callback=jQuery110207164248435292393_1391195897558, что должно привести к

jQuery110207164248435292393_1391195897558([{"id":3134,"lon" .... }])

возвращаются со службы.

Вам нужно будет изменить эту строку в коде вашего сервера:

@JSONP(queryParam = "callback")

ссылка: https://jersey.java.net/documentation/latest/user-guide.html#d0e7040

person Kevin B    schedule 31.01.2014
comment
Спасибо за ваш ответ, но как я могу сделать это с джерси? поскольку я обычно возвращаю сложные объекты и позволяю им быть jsonified через moxy, я не могу просто связать строку с функцией обратного вызова. - person Daniel Gerber; 01.02.2014

Я нашел решение здесь! АГА! Это на самом деле довольно просто. Методы должны быть объявлены следующим образом:

@JSONP(queryParam="callback")
@Produces({"application/x-javascript"})
public TestResult getAllTestData(@QueryParam("callback") String callback) 

и запрос ajax выглядит так:

$.getJSON(serviceURL + 'get?callback=?', function(data) { ...

привет, Даниэль

person Daniel Gerber    schedule 31.01.2014
comment
Что вы пишете в аннотации @JSONP, которую мы там создаем - person Learner; 26.11.2014
comment
рабочий пример кода для представленного выше решения можно найти здесь: github .com/jersey/jersey/tree/2.15/examples/json-with-padding - person marius_neo; 09.02.2015