Вызов сервиса Micronaut с помощью AJAX не работает

У меня есть служба Micronaut, которая вызывается из клиента с помощью вызова AJAX, реализованного в JQuery. Сервис Micronaut представлен ниже:

 @Controller("/ajaxcaller")
 public class AjaxService
{
   @Get("/printit")
   @Produces(MediaType.TEXT_PLAIN)
   public String updateData(Session theSess)
   {
      System.out.println("Accessing from AJAX.");

      return("Successful!");
   }
}

Ниже приведен код Javascript, который вызывает службу микронавтов:

  $.ajax({
      url : '/ajaxcaller/printit',
      type: "GET",
      contentType: 'application/text',
      success: function(data, textStatus, jqXHR)
      {
         alert("Get successful! "+data);
      },
      error: function (jqXHR, textStatus, errorThrown)
      {
         alert("Get failed! Error: "+jqXHR.status+", "+errorThrown);
      }
  });

К сожалению, несмотря на то, что я говорю серверу и клиенту обрабатывать простой текст, вызов AJAX завершается ошибкой со следующим сообщением:

 Get failed! Error: 415, Unsupported Media Type

Обнаружил ли я ошибку в обработчиках контроллеров Micronaut или мне что-то не хватает в коде клиента или сервера? Есть ли способ заставить этот вызов AJAX работать?

ОБНОВЛЕНИЕ: следуя совету Джеймса в ответе 1 ниже, в код были внесены следующие изменения, как показано ниже:

 @Controller("/ajaxcaller")
 public class AjaxService
 {
   @Get("/printit")
   @Consumes("application/text")
   public String updateData(Session theSess)
   {
      System.out.println("Accessing from AJAX.");

      return("Successful!");
   }
}

Я все еще получаю сообщение об ошибке 415, когда пытаюсь использовать службу.

Поскольку я ранее создавал и успешно использовал другие службы Get в Micronaut, я провел тест на этой, используя другую страницу. По сути, вместо использования вызова ajax для вызова службы я использовал следующую строку в файле HTML:

window.location.href = '/ajaxcaller/printit';

Вызов этого вызывает создание новой страницы, которая отображает строку, возвращаемую службой (что, конечно, было ожидаемым поведением). Ошибок 415 не возникает, даже если я удалю аннотацию @Consumes.

Очевидно, что служба Micronaut обрабатывает вызов AJAX иначе, чем вызов обычной страницы. Есть ли параметр на стороне AJAX, который мне не хватает, или есть ошибка в Micronaut, препятствующая успешным вызовам AJAX?


person Factor Three    schedule 23.02.2019    source источник
comment
кажется, вы не передаете никаких данных в свой Ajax ?? В этом случае он обязательно выдаст эту ошибку, потому что данных нет.   -  person Rohit Mittal    schedule 23.02.2019


Ответы (2)


Как следует из ошибки, вы отправляете неподдерживаемый тип носителя.

@Produces(MediaType.TEXT_PLAIN) сообщает Micronaut, какой тип контента будет создаваться. Вы ничего не указали о типе контента, который можно использовать, поэтому по умолчанию используется application/json.

Добавление @Consumes("application/text") сообщит Micronaut о типе контента, который вы собираетесь использовать, на основе предоставленного вами вызова ajax.

person James Kleeh    schedule 23.02.2019
comment
Джеймс: Добавление аннотации @Consumes не помогло. Я все еще получаю ошибку 415. Изменение кода добавлено в приведенное выше редактирование. - person Factor Three; 23.02.2019

Оказывается, в комментарии Рохита Миттала была указана проблема. Удалив параметр contentType из вызова AJAX, я смог устранить 415 сбоев.

Я провел несколько дополнительных экспериментов и обнаружил, что с вызовами AJAX тип контента должен быть точно указан как на клиенте, так и на сервере. Если, однако, вы просто выполняете GET с использованием AJAX, не передавая ничего в службу, не устанавливайте тип контента, потому что это вызовет 415 сбоев, независимо от того, добавляете ли вы аннотацию @Consumes в службу или нет.

Если вы не используете AJAX, эти соображения, по-видимому, не имеют значения. Сервисы Micronaut работают в этих условиях при сбое вызовов AJAX.

person Factor Three    schedule 26.02.2019