这个问题真的让我发疯了...我有2个java web应用程序:appA发布一个REST服务,它返回一些json格式的对象(包含一个图像),以及使用该服务并显示图像的appB 。在我的本地机器上它工作(虽然我看到CORS错误)但现在我正在使用Web环境(Layershift),我收到错误“NetworkError:404 Not Found - http://app-demo.j.layershift.co.uk/myservice/get/c80e9306105f4448?callback=myCallback&_=1477167892656”
我一直在阅读很多关于CORS和JSONP的例子,但我找不到我的代码有什么问题,有人可以提示吗?
appA中的控制器:
@RestController
public class MyController {
@RequestMapping(value="/myservice/get/{somevar}")
public @ResponseBody MyObject getMyObject (@PathVariable String somevar, HttpServletRequest request, HttpServletResponse response) {
MyObject obj = new MyObject();
//some logic
return obj;
}
}
appA中的ControllerAdvice:
@ControllerAdvice
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
public JsonpAdvice() {
super("myCallback");
}
}
在appB中使用jsonp调用的javascript代码:
(function($) {
function myCallback(data) {
if (data.status == "OK") {
//shows the image contained
}
}
$.fn.callWithJsonP = function(somevar) {
$.ajax({
url: "myservice/get/" + somevar,
type: 'GET',
dataType: "jsonp",
jsonpCallback: "myCallback"
});
};
})(jQuery);
任何帮助将不胜感激,问候
PS:还尝试在Apache中添加指令“Header add Access-Control-Allow-Origin”*“”,但结果相同。
答案 0 :(得分:0)
以下是如何使用Jquery执行JsonP ajax调用。 E.g:
$.ajax({
url: "http://localhost/ny-app/getJSfunction",
jsonp: "myfunctionName",
dataType: "jsonp",
data: soomedata,
success: function( response ) {
console.log( response ); // server response
}
});
在服务器端处理此调用,并返回一个函数封装的javascript代码,该代码返回一些数据。返回的javascript将如下所示:
function myfunctioname(){
// some code
return 'whatever you want' ;
}
JQuery ajax将自动执行返回的javascript函数。
希望这有帮助。
答案 1 :(得分:0)
最后可以拨打JSONP电话,没有解决我的问题,但我能够拨打电话,所以我会发布更改。
首先,在主控制器中我没有使用@ResponseBody,我已经改变了它:
@RestController
public class MyController {
@RequestMapping(value="/myservice/get/{somevar}")
public MappingJacksonValue getMyObject (@RequestParam String callback, @PathVariable String somevar, HttpServletRequest request, HttpServletResponse response) {
MyObject obj = new MyObject();
//some logic
MappingJacksonValue value = new MappingJacksonValue(obj);
value.setJsonpFunction(callback);
return value;
}
}
注意返回类型是MappingJacksonValue(感谢JSONP with Spring 3.0 and Jackson),javascript代码是这样的:
$.fn.callWithJsonP = function(somevar) {
var url = "/myservice/get/" + somevar + "?callback=myCallback";
$.getJSON(url, function(data) {
if (data.value.status == "OK") {
//show the image contained
}
});
}
无需定义名为" myCallback"的函数。我已经在我的本地机器上进行了测试,它正在运行。
感谢大家的建议。