2016-10-24 76 views
0

這個問題真的讓我瘋狂......我有2個Java Web應用程序:發佈REST服務的appA,它以json格式返回一些對象(它包含一個圖像),以及消耗的appB該服務並顯示圖像。在我的本地機器上它可以工作(雖然我看到了CORS錯誤),但現在我正在使用Web環境(Layershift),並且出現錯誤「NetworkError:404 Not Found - http://app-demo.j.layershift.co.uk/myservice/get/c80e9306105f4448?callback=myCallback&_=1477167892656
我一直在閱讀很多的CORS和JSONP的例子,但我找不到我的代碼有什麼問題,任何人都可以提供一個提示?不能讓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; 
} 
} 

ControllerAdvice中的appA:

@ControllerAdvice 
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice { 
public JsonpAdvice() { 
    super("myCallback"); 
} 
} 

的JavaScript在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:也嘗試添加指令「頭添加Access-Control-Allow-Origin「*」「,但結果相同。

+0

404意味着您正在嘗試訪問不存在的端點。你確定你有正確的網址嗎? –

+0

嗨@JoeAttardi,是的,網址是正確的 – maxivis

+0

爲什麼你使用'jsonp'他們在不同的域?我也認爲ajax url需要有'/'例如'/「myservice/get /」+ somevar'。需要查看'applicationContext' – brk

回答

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」的函數。我已經在我的本地機器上測試過,它正在工作。
謝謝大家的建議。

0

以下是如何使用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函數。

希望這會有所幫助。

+0

他得到404錯誤,因爲該URL是錯誤的。這有什麼關係? – Barmar

+0

謝謝@DragoRaptor,但是「成功」功能是否必要?根據你的定義,不應該叫「myfunctionName」而不是「成功」? – maxivis