无法进行 JSONP 调用
Can't make JSONP call
这个问题真的让我抓狂...我有 2 个 java 网络应用程序:appA 发布了一个 REST 服务,returns [=30] 中的某个对象(包含图像) =] 格式,以及使用服务并显示图像的 appB。在我的本地机器上它可以工作(虽然我看到了 CORS 错误)但现在我使用的是网络环境 (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");
}
}
java在 appB 中调用 jsonp 的脚本代码:
(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 "*"",但结果相同。
以下是使用 Jquery 执行 JsonP ajax 调用的方法。
例如:
$.ajax({
url: "http://localhost/ny-app/getJSfunction",
jsonp: "myfunctionName",
dataType: "jsonp",
data: soomedata,
success: function( response ) {
console.log( response ); // server response
}
});
在服务器端处理此调用,return 函数封装了 javascript 代码,return 一些数据。 returned javascript 将如下所示:
function myfunctioname(){
// some code
return 'whatever you want' ;
}
JQuery ajax 将自动执行 returned javascript 函数。
希望对您有所帮助。
终于可以进行 JSONP 调用了,虽然没有解决我的问题,但是我可以进行调用,所以我将 post 进行更改。
首先,在主控制器中我没有使用@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;
}
}
注意 return 类型是 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" 的函数。我已经在我的本地机器上测试过,它正在工作。
感谢大家的建议。
这个问题真的让我抓狂...我有 2 个 java 网络应用程序:appA 发布了一个 REST 服务,returns [=30] 中的某个对象(包含图像) =] 格式,以及使用服务并显示图像的 appB。在我的本地机器上它可以工作(虽然我看到了 CORS 错误)但现在我使用的是网络环境 (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");
}
}
java在 appB 中调用 jsonp 的脚本代码:
(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 "*"",但结果相同。
以下是使用 Jquery 执行 JsonP ajax 调用的方法。 例如:
$.ajax({
url: "http://localhost/ny-app/getJSfunction",
jsonp: "myfunctionName",
dataType: "jsonp",
data: soomedata,
success: function( response ) {
console.log( response ); // server response
}
});
在服务器端处理此调用,return 函数封装了 javascript 代码,return 一些数据。 returned javascript 将如下所示:
function myfunctioname(){
// some code
return 'whatever you want' ;
}
JQuery ajax 将自动执行 returned javascript 函数。
希望对您有所帮助。
终于可以进行 JSONP 调用了,虽然没有解决我的问题,但是我可以进行调用,所以我将 post 进行更改。
首先,在主控制器中我没有使用@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;
}
}
注意 return 类型是 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" 的函数。我已经在我的本地机器上测试过,它正在工作。
感谢大家的建议。