Тип содержимого не задан в запросе JSONP от двух разных портов - PullRequest
1 голос
/ 05 апреля 2011

Эта ситуация убивает меня.Запрос JSONP Jjery Ajax JSONP от http://example.com:80 до http://example1.com:8080 никогда не устанавливает тип содержимого, и Spring MVC выдает жалобы на сервер при попытке сериализации моего javabean в параметре контроллера.Если я проверяю запрос JSONP на любом веб-сайте, вызывающем один и тот же домен, он устанавливает тип содержимого.Это проблема порта?Я тестирую сайт Wordpress для Spring MVC API на моем локальном компьютере.

handlerMapperInvoker.java - здесь возникает ошибка в Spring Framework

MediaType contentType = inputMessage.getHeaders().getContentType();
        if (contentType == null) {
            StringBuilder builder = new StringBuilder(ClassUtils.getShortName(methodParam.getParameterType()));
            String paramName = methodParam.getParameterName();
            if (paramName != null) {
                builder.append(' ');
                builder.append(paramName);
            }
            throw new HttpMediaTypeNotSupportedException(
                    "Cannot extract parameter (" + builder.toString() + "): no Content-Type found");
    }

apicontroller.java - API Side

@RequestMapping(value="/badge/get")
public @ResponseBody IHttpResponse getBadge(@RequestBody GetBadgeRequest request) {

    apiService.getBadge(request);

    return request.getResponse();
}

api.js - Wordpress

getBadge : function(id) {

        var model = 
        {
            id : id
        };

        this.call({ url: 'badge/get.json', type: 'GET', data: model, callback: function(data)
        {
            alert(data);
        }});
    },

call : function(options) {

        var def = {
            url : '',
            type : "POST",
            dataType : 'jsonp',
            data : undefined,
            contentType : "application/json",
            callback : function() {},
            errorCallback : function() {}
        };

        $.extend(def, options);

        var sessionToken = api.getSession();

        if(sessionToken && sessionToken != "undefined") {
            if(!def.data) {
                def.data = {};
            }

            def.data.sessionToken = sessionToken;
        }

        var url = config.baseUrl + def.url;

        // Abort Request If Another One Is Made
        if (config.request != null)
            config.request.abort();

        if (def.showLoader) {
            application.loader(true);
        }

        config.request = $
                .ajax({
                    url : url,
                    type : def.type,
                    data : { request: $.toJSON(def.data) },
                    dataType : def.dataType,
                    contentType : def.contentType,
                    success : function(data) {
                        if (def.showLoader) {

1 Ответ

1 голос
/ 05 апреля 2011

Запросы JSONP вне текущего домена всегда выполняются как запросы сценариев для обхода одной и той же политики происхождения. Параметры будут закодированы в URL (то есть, без POST, только GET для скрипта). Поскольку невозможно указать тип содержимого в запросе сценария, он не отображается. Когда это делается локально, он сохраняет тип контента, поскольку фактически выполняет настоящий запрос AJAX.

По сути, запрос AJAX для JSONP для другого домена:

<script type="text/javascript" src="http://example1.com:8080/badge/get.json?request=...&callback=somefunction">
</script>

И он ожидает получить взамен скрипт вроде:

somefunction( { ... your json here ... } );

Обратите внимание, что при использовании jQuery somefunction фактически является автоматически сгенерированным именем.

...