【问题标题】:Can't make JSONP call无法进行 JSONP 调用
【发布时间】:2020-01-07 12:00:04
【问题描述】:

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

【问题讨论】:

  • 404 表示您正在尝试访问不存在的端点。您确定您的网址正确吗?
  • 嗨@JoeAttardi,是的,网址是正确的
  • 你为什么使用jsonp 他们在不同的域上?我也认为ajax url需要有一个起始/,例如/"myservice/get/" + somevar。需要看applicationContext
  • 嗨@user2181397,是的,他们在不同的域中。关于 ajax URL,我已对其进行了更改,因此可以在此处发布,但在我的实际应用程序中,它包含其他 Web 应用程序的完整 URL
  • 如果您收到 404,则 URL 不正确。

标签: javascript jquery jsonp


【解决方案1】:

以下是使用 Jquery 执行 JsonP ajax 调用的方法。 例如:

$.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函数。

希望这会有所帮助。

【讨论】:

  • 他收到 404 错误,因为 URL 错误。这有什么关系?
  • 感谢@DragoRaptor,但是“成功”功能是否必要?根据你的定义,不应该叫“myfunctionName”而不是“success”?
【解决方案2】:

终于可以进行 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”的函数。我已经在我的本地机器上进行了测试,它正在工作。
感谢大家的建议。

【讨论】:

    猜你喜欢
    • 2012-05-09
    • 2012-04-22
    • 2015-08-22
    • 2013-07-28
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2011-05-12
    • 2013-10-22
    相关资源
    最近更新 更多