api传递另一个api响应

时间:2020-02-13 14:11:51

标签: java xml spring api unmarshalling

我和我的团队正在使用GWT 2.4(JDK 1.6.0_45)开发一些旧的但相当大的应用程序。

我们目前正面临使用HTTP协议的public API。他们最近切换到了HTTP 6,Java 6(免费版)无法很好地使用HTTPS。

我有多种解决方法:

  • 升级到可维护但非免费的Java 6版本(我们希望避免付费)
  • 升级到Java 8(与Java 8不兼容的GWT 2.4,因此我们还必须升级到GWT 2.8,考虑到应用程序的大小,这将需要一些时间)
  • 开发一个小型Api来捕获此公共API的响应,然后使用HTTP协议将其发送回我的应用程序

我开始了第三个解决方案,但是在解组收到的响应(xml)时遇到了一些问题。

这是我到目前为止所做的:

我调用公共API的API方法:

@Override
public ResponseEntity<WorkMetadataType> lookupWithFilter(String authorization, String filter, String id, Optional<String> accept, Optional<String> xISANAuthorization, Optional<String> idtype) {
    WorkMetadataType res = isanApi.lookupWithFilter(authorization, filter, id, accept.orElse(null), xISANAuthorization.orElse(null), idtype.orElse(null));
    if (res == null) {
        throw new WorkNotFoundException();
    }
    return ResponseEntity.ok(res);
}

调用公共API的方法。

public WorkMetadataType lookupWithFilter(String authorization, String filter, String id, String accept, String xISANAuthorization, String idtype) {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(getHttpClient()));
    try {
        CustomMarshallingHttpMessageConverter converter;
        converter = new CustomMarshallingHttpMessageConverter(JAXBContext.newInstance(ISANDataType.class));
        converter.setDefaultCharset(StandardCharsets.UTF_8);
        restTemplate.getMessageConverters().add(converter);
    } catch (JAXBException e) {
        logger.error("Erreur lors de la définition du marshaller", e);
    }
    HttpEntity<String> entity = new HttpEntity<>(null, getHeaders(authorization, accept, xISANAuthorization));

    return restTemplate.exchange(getRequestUri(id, idtype, filter), HttpMethod.GET, entity, WorkMetadataType.class).getBody();
}

如您所见,我正在使用Spring和他的RestTemplate类。问题是,您需要指定响应的性质,由于我的编组问题,我希望避免这种行为。

我的问题是:是否有可能将此公共API的响应传输到我的应用程序而不会被我的API接收而消耗它? (简单地,将其复制/粘贴)

1 个答案:

答案 0 :(得分:0)

我最终使用HttpCliendBuilder来构建请求并获得InputStream作为响应。 这样,我可以将其转换为String并使用它创建一个ResponseEntity。