Spring boot & Jquery 415 (неподдерживаемый тип носителя) - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь сделать ajax междоменный пост-вызов API-интерфейсам веб-служб весеннего отдыха в безопасном контексте. Начиная с Jquery я не могу установить атрибут contentType, потому что у меня проблемы с безопасным контекстом. Но без contentType от Spring я получаю следующий ответ: 415 (неподдерживаемый тип носителя)

Контроллер Spring:

@RequestMapping(value = "/all", method = RequestMethod.POST)
    @PreAuthorize("hasAnyAuthority('PROF1','SUDO')")

Jquery:

function getAllUsers(){
    var obj = {"limit":10,"page":0};
     $.ajax({
         url:"https://webServerSite/myService/api/v1/user/all",
         dataType: 'json',
         xhrFields: {
             withCredentials: true
          },
         crossDomain: true,
         data:obj,
         type: "post",
         success:function(json){
             var str = JSON.stringify(json);
             console.log(str);
         },
         error:function(xhr, status, error) {
              alert(xhr.responseText);
            }    
    });
}

Там такое отключить в Spring проверку contentType? Все мои данные json, и я sh установлю это по умолчанию, избегая проверки заголовка типа содержимого. Я попытался определить пользовательский конвертер сообщений и с помощью следующего кода не работал:

@Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {

        //set path extension to true
        configurer.favorPathExtension(true).
        //set favor parameter to false
        favorParameter(false).
        //ignore the accept headers
        ignoreAcceptHeader(true).
        //dont use Java Activation Framework since we are manually specifying the mediatypes required below
        useJaf(false).
        defaultContentType(MediaType.APPLICATION_JSON).
        mediaType("xml", MediaType.APPLICATION_XML).
        mediaType("json", MediaType.APPLICATION_JSON);
      }

Спасибо

1 Ответ

0 голосов
/ 14 марта 2020

Вы можете указать тип контента, который принимает ваш метод контроллера, используя аннотацию @RequestMapping с полем consumes. В вашем случае вы можете принять все типы контента со следующими данными:

import org.springframework.http.MediaType;

@RequestMapping(value = "/all", method = RequestMethod.POST, consumes = {MediaType.ALL_VALUE})

ОБНОВЛЕНИЕ :

Не следует отключать проверку заголовка, в противном случае сервер не знает, какой тип контента является входящим и как правильно его анализировать.

Учитывая вашу трассировку стека, я думаю, что ошибка исходит из другого источника. Вы пытаетесь проанализировать входящий application/x-www-form-urlencoded; charset=UTF-8 в @RequestBody, что невозможно в Spring.

Эта проблема уже была решена в другом месте: Http Post-запрос с типом контента application / x- www-form-urlencoded, не работающий в Spring

...