使用AJAX调用Micronaut服务失败

时间:2019-02-23 02:49:12

标签: jquery ajax micronaut

我有一个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调用正常工作?

更新:根据詹姆斯在下面的答案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调用?

2 个答案:

答案 0 :(得分:1)

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

@Produces(MediaType.TEXT_PLAIN)告诉Micronaut将产生什么内容类型。您尚未指定可以被消耗的内容类型的任何内容,因此默认为application/json

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

答案 1 :(得分:0)

事实证明,罗希特·米塔尔(Rohit Mittal)的评论确定了问题所在。通过从AJAX调用中删除contentType设置,我能够消除415个失败。

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

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