即使请求了 format=json,YQL 也会返回 application/javascript

Posted

技术标签:

【中文标题】即使请求了 format=json,YQL 也会返回 application/javascript【英文标题】:YQL returns application/javascript even when format=json is requested 【发布时间】:2015-03-28 03:50:25 【问题描述】:

我正在尝试在 Spring Boot 应用程序中对 YQL 进行 REST 调用。即使我设置了“format=json”,调用也会返回“application/javascript”,这会导致以下消息:

org.springframework.web.client.RestClientException:无法提取响应:没有找到适合响应类型 [class com.dilteam.research.YqlQueryResult] 和内容类型 [application/javascript;charset=utf-8] 的 HttpMessageConverter /p>

这里是方法(processTicker)和相关的类(YqlQueryResult):

public void processTicker(String ticker) 
    RestTemplate restTemplate = new RestTemplate();
    String query = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%3D'YHOO'&format=json&callback=?";
    YqlQueryResult qr = restTemplate.getForObject(query, YqlQueryResult.class);
    System.out.println("result" + qr.results);


@JsonIgnoreProperties(ignoreUnknown = true)
public class YqlQueryResult 
    public String results;

我做错了什么?

【问题讨论】:

【参考方案1】:

您的RestTemplate 不知道如何阅读application/javascript 回复。假设 application/javascript 实际上是 JSON,您可以通过向您的 RestTemplate 添加适当配置的转换器来解决您的问题:

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(new MediaType("application", "javascript")));
restTemplate.getMessageConverters().add(javascriptConverter);

【讨论】:

new MediaType("application/javascript") 不起作用,所以我改为: new MediaType("application", "javascript") 现在得到: 由:com.fasterxml.jackson 引起。 core.JsonParseException:意外字符('/'(代码 47)):可能是(非标准)注释? (由于未为解析器启用功能“ALLOW_COMMENTS”,因此无法识别为一个)返回的 JSON 具有以下内容:/**/v("query":..... 为了解决“COMMENTS”问题,添加了以下行,但现在它返回一个 Null 对象:converter.getObjectMapper().configure(JsonParser.Feature.ALLOW_COMMENTS, true); 我得到 'Null' 的原因是表 'yahoo.finance.quotes' 在 YQL 上不再可用。诡异的。可能是雅虎!改变了它的政策!关闭这个问题。感谢安迪的指点。

以上是关于即使请求了 format=json,YQL 也会返回 application/javascript的主要内容,如果未能解决你的问题,请参考以下文章

即使光标关闭,Psycopg 请求也会挂起

返回雅虎!摄氏天气 API 数据,使用 YQL

即使正确设置了 document.domain,跨子域 ajax 请求也会被拒绝

跨域请求被阻止:即使在我的 API 上启用了 CORS 后也会发生;

即使从 package.json 中删除,node-gyp 也会尝试构建依赖项

为啥即使我在后台请求位置更新,我的 iOS 应用程序也会被杀死?