【问题标题】:Spring API application/json is not working when getting text/json content type获取 text/json 内容类型时,Spring API application/json 不起作用
【发布时间】:2017-09-11 08:54:46
【问题描述】:

我正在查询 PhraseApp API 以获取翻译并将标题上的内容类型设置为 appplication/json:

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

但 API 会以附件形式发送响应,内容类型为 text/json; charset=UTF-8。 Spring引发了错误:

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class java.lang.String] and content type [text/json;charset=UTF-8]

我得到的回复如下:

{
  "some.key.a": "some translation for a",
  "some.key.b": "some translation for b",
  "some.key.c": "some translation for c"
...
}

我希望将响应分配给一个字符串变量并稍后对其进行解析。 关于这里出了什么问题的任何想法?谢谢。

【问题讨论】:

  • 像这样直接添加转换器:private List<HttpMessageConverter<?>> getMessageConverters() { List<HttpMessageConverter<?>> converters = new ArrayList<>(); converters.add(new MappingJackson2HttpMessageConverter()); return converters; } 然后restTemplate.setMessageConverters(getMessageConverters()); 没有解决问题...

标签: json spring api


【解决方案1】:

根据JSON-specification,JSON 的内容类型应始终为“application/json”。

一种可能的解决方法是编辑请求并设置正确的内容类型。

幸运的是,我来自 PhraseApp 团队,可以简单地在我们这边解决这个问题 ;)

您现在应该可以将它与您的原始代码一起使用了!

如果您需要进一步的帮助,请给我发送 PN 或电子邮件至 vincent@phraseapp.com

【讨论】:

  • 文森特,感谢您的回复。我已经收到来自 PhraseApp 的反馈,说已修复。
【解决方案2】:

我必须使用以下步骤才能使其正常工作:

  1. 使用/api/v2/projects/{projectId}/locales/{localeId}/download

  2. 如下创建自定义转换器:

    公共类 PhraseTextJsonConverter 扩展 MappingJackson2HttpMessageConverter { 公共 PhraseTextJsonConverter() { setSupportedMediaTypes(initMediaTypes()); }

    private List<MediaType> initMediaTypes() {
        return Arrays.asList(new MediaType("text", "json", DEFAULT_CHARSET));
    }
    

    }

  3. 向模板添加转换器:

    protected static RestTemplate createRestTemplateWithConverter() {
            final RestTemplate restTemplate = new RestTemplate();
            final List<HttpMessageConverter<?>> httpMessageConverters = new ArrayList<>();
            httpMessageConverters.add(new MappingJackson2HttpMessageConverter());
            httpMessageConverters.add(new ByteArrayHttpMessageConverter());
            restTemplate.setMessageConverters(httpMessageConverters);
    
            return restTemplate;
        }
    

    以及后来的自定义:

    private void addPhraseTextJsonConverter() {
            restTemplate.getMessageConverters().add(new PhraseTextJsonConverter());
        }
    

为了能够将所有翻译作为 Map,我必须使用 ParameterizedTypeReference,如下所示:

protected ResponseEntity<HashMap<String, String>> requestPhraseApp(final HttpEntity<Object> requestEntity, final URI uri) {
        ParameterizedTypeReference<HashMap<String, String>> typeRef = new ParameterizedTypeReference<HashMap<String, String>>() {};
...
return restTemplate.exchange(uri, HttpMethod.GET, requestEntity, typeRef);
...
}
  1. 不要忘记初始化请求参数以获取地图中的所有翻译:

    List urlParameters = new ArrayList(); urlParameters.add(new BasicNameValuePair("file_format", "simple_json"));

就是这样。

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 1970-01-01
    • 2017-10-21
    • 2019-12-16
    • 1970-01-01
    • 2013-05-09
    • 2016-11-17
    • 2018-05-12
    • 2015-08-13
    相关资源
    最近更新 更多