使用 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 服务在这些条件下工作。
我有一个 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 服务在这些条件下工作。