无法进行JSONP调用

时间:2016-10-24 17:56:24

标签: javascript jquery cors jsonp

这个问题真的让我发疯了...我有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”*“”,但结果相同。

2 个答案:

答案 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"的函数。我已经在我的本地机器上进行了测试,它正在运行。
感谢大家的建议。