2

我有一个 REST API,直到现在它总是返回 JSONP(JSON 数据包装在客户端想要的任何函数调用中):

static final String JAVASCRIPT = "application/javascript;charset=UTF-8"; 

@RequestMapping(value = "/matches", produces = JAVASCRIPT)
@ResponseBody
public String matches(@RequestParam String callback) {
    String json = jsonService.getCachedJson("/matches");
    return toJsonp(callback, json);
}

现在,情况发生了变化,因此我需要返回JSON 或 JSONP:如果客户端提供回调函数名称,我们返回 JSONP,否则返回纯 JSON。

关于内容类型,我希望尽可能正确并用于application/jsonJSON 和application/javascriptJSONP

所以,像这样:

@RequestMapping(value = "/matches")
@ResponseBody
public String matches(@RequestParam(required = false) String callback) {
    String json = jsonService.getCachedJson("/matches");

    // TODO: if callback == null, set content type to "application/json", 
    // otherwise to "application/javascript"

    return jsonOrJsonp(callback, json);
}

String jsonOrJsonp(String callback, String json) {
    return Strings.isNullOrEmpty(callback) ? json : toJsonP(callback, json);
}

看起来我不能再produces使用@RequestMapping. 在上述场景中,使用 Spring MVC 设置内容类型的最简单方法是什么

如果可能的话,我想避免定义 HttpMessageConverters (或其他 Spring 麻烦)或更改方法返回类型!显然我不喜欢重复的方法声明,其中produces值是唯一显着的区别。我正在寻找的是对上述代码的最小更改。

最新的春天 (3.2.3)。

4

1 回答 1

2

您是否尝试过仅使用两种请求处理程序方法?

@RequestMapping(value = "/matches", produces = JAVASCRIPT, params="callback")
@ResponseBody
public String Jsonp(@RequestParam String callback) {
    return toJsonp(callback, jsonService.getCachedJson("/matches"));
}

@RequestMapping(value = "/matches", produces = JSON)
@ResponseBody
public String json() {
    return toJson(jsonService.getCachedJson("/matches"));
}

带有参数的第一个方法params将仅映射到callback存在参数的请求。

于 2013-05-29T01:31:31.520 回答