无法使用Ajax从其他域获取JSON

时间:2018-02-12 19:52:56

标签: javascript java ajax jsonp spring-rest

我正在尝试使用JSONP从另一个使用Spring的域中获取JSON。所以,我写了JsonpControllerAdvice

@ControllerAdvice
public class JsonpControllerAdvice extends AbstractJsonpResponseBodyAdvice {

    public JsonpControllerAdvice() {
        super("callback");
    }
}

我的控制员:

@RequestMapping("games")
@RestController
public class GameController extends BaseGameController {

    private static final Logger LOGGER = Logger.getLogger(GameController.class);

    private static final String KAFKA_TOPIC = "virto_games";

    private static final String ROOT_URL = ServerConfig.GAMES_HOST + "/games";

    @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> games(
            @RequestParam(defaultValue = "0") int page
    ) {
        String url = ROOT_URL + "?page=" + page;
        return request.get(url);
    }
}

在浏览器中,它返回下一个JSON:

{
    "items":[{
        "id":"1b4a3104-925b-46ac-a2da-2187bbf46e0a",
        "name":"Minecraft",
        "description":"Game",
        "user_id":"ee430ea5-0977-4fc2-b1c4-cc33ddd9db56"
    }],
    "number":0,
    "count":1
}

在我的js代码下面是我试图获取JSON的地方:

var virtoHost = "http://localhost:8080/";

function getGames() {
    $.ajax({
        url: virtoHost + 'games',
        dataType: 'JSONP',
        jsonpCallback: 'callback',
        type: 'GET',
        success: function (data) {
            alert(JSON.stringify(data));
        }
    });
}

但它崩溃了例外:

SyntaxError: unexpected token: ':'
[Learn More]
games:1:8

出了什么问题?我检查了它是否是正确的JSON,:是标准分隔符。

1 个答案:

答案 0 :(得分:0)

我收到了错误...我不知道AbstractJsonpControllerAdvice设置杰克逊为JSON-P提供支持。在我的情况下,我从游戏服务器获得一个准备好的JSON对象,杰克逊没有采取任何行动...... 因此,我需要在我的游戏服务器上启用JSON-P支持,并将callback从我的聚合服务器重新发送到游戏服务器。