使用 AJAX 调用 Micronaut 服务失败

Calling Micronaut service using AJAX fails

我有一个 Micronaut 服务,它是使用 JQuery 中实现的 AJAX 调用从客户端调用的。 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!");
   }
}

调用micronaut服务的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 调用正常工作吗?

更新:根据 James 在下面的答案 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 失败消息。

因为之前在Micronaut中创建过其他的Get服务并成功使用过,所以我用不同的页面对这个进行了测试。基本上,我没有使用 ajax 调用来调用服务,而是在 HTML 文件中使用了以下行:

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

调用它会生成一个新页面,显示服务返回的字符串(当然,这是预期的行为)。没有生成 415 错误——即使我删除了 @Consumes 注释。

显然,Micronaut 服务处理 AJAX 调用的方式与常规页面调用不同。 AJAX 方面是否有我遗漏的设置,或者 Micronaut 中是否存在阻止成功 AJAX 调用的错误?

如错误所示,您发送的媒体类型不受支持。

@Produces(MediaType.TEXT_PLAIN) 告诉 Micronaut 将生成什么内容类型。您没有指定任何关于可以 consumed 的内容类型,所以它默认为 application/json.

添加 @Consumes("application/text") 将告诉 Micronaut 您将要使用的内容类型,这基于您提供的 ajax 调用。

事实证明,Rohit Mittal 的评论指出了问题所在。通过从 AJAX 调用中删除 contentType 设置,我能够消除 415 失败。

我做了一些进一步的实验,发现 AJAX 调用应该在客户端和服务器上准确指定内容类型。但是,如果您只是使用 AJAX 执行 GET 而没有向服务传递任何内容,则不要设置内容类型,因为无论您是否向服务添加 @Consumes 注释,这都会导致 415 失败。

如果您不使用 AJAX,这些注意事项显然变得无关紧要。当 AJAX 调用失败时,Micronaut 服务在这些条件下工作。