我有一个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调用?
答案 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服务将在这种情况下工作。