java - LinkedMultiValueMap 与覆盖的方法
问题描述
所以我有一些代码,其中正在进行 API 调用,以字节为单位发送 pdf 文件,并使用 LinkedMultiValueMap 返回响应。我是 LinkedMultiValueMap 的新手,这段代码根本不是我写的,所以我很难理解这一切。
API 调用
IntegrationResult<UploadResDto> UploadRes = uploadService.postUpload(File);
文件是 ByteArrayInputStream 类型,它是使用函数生成的 pdf 文件夹。UploadResDto 基本上只是响应的结构
public Header headers;
public Body body;
public String statusCode;
public int statusCodeValue;
上传文件的服务
public IntegrationResult<UploadResDto> postUpload(ByteArrayInputStream inputStream) {
ConsentUploadResDto response;
try {
response = getResponseObjectDto(inputStream, UploadResDto.class);
} catch (Exception e) {
log.error(e);
return new IntegrationResult<>(null, EXCEPTION);
}
return new IntegrationResult<>(response);
}
private <T> T getResponseObjectDto(ByteArrayInputStream inputStream, Class<T> clazz) throws JsonProcessingException {
String responseBody = FileUploadClient.exchange(inputStream);
if (StringUtils.isBlank(responseBody)) {
return null;
}
return new ObjectMapper().readValue(responseBody, clazz);
}
客户服务
public String exchange(ByteArrayInputStream inputStream) {
RestTemplate restTemplate = getRestTemplate();
Optional<ResponseEntity<String>> responseEntity;
try {
LinkedMultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("file", new InputStreamResource(inputStream) {
@Override
public String getFilename(){
return filename;
}
});
HttpEntity<MultiValueMap<String, Object>> requestEntity
= new HttpEntity<>(body, getHeaders());
responseEntity = Optional.of(
restTemplate
.postForEntity(getUri(url), requestEntity, String.class));
log.infof("%s", responseEntity.map(ResponseEntity::getBody).orElse(null));
} catch (Exception e) {
log.debug(e.getMessage());
return null;
}
if (HttpStatus.OK.equals(responseEntity.map(ResponseEntity::getStatusCode).orElse(null))) {
return responseEntity.map(ResponseEntity::getBody)
.orElseThrow(() -> new ApiClientException("ResponseEntity body not found."));
}
throw new FileUploadApiClientException("Unexpected httpStatus.");
}
private URI getUri(String httpUrl) {
return UriComponentsBuilder.fromHttpUrl(httpUrl).build().toUri();
}
private HttpHeaders getHeaders() {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MULTIPART_FORM_DATA);
return httpHeaders;
}
private RestTemplate getRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory simpleClient = new SimpleClientHttpRequestFactory();
simpleClient.setConnectTimeout(connectTimeout);
simpleClient.setReadTimeout(readTimeout);
ClientHttpRequestFactory factory = new BufferingClientHttpRequestFactory(simpleClient);
restTemplate.setRequestFactory(factory);
return restTemplate;
}
}
这部分是开始让我有点不知所措的地方。为什么我们需要将 responseBody 作为字符串返回。字符串以空白形式返回给我,所以我得到空值?交换功能究竟是做什么的?此外,我找不到任何覆盖其中方法的 LinkedMultiValue 示例,因此我无法理解覆盖其中的方法的真正作用以及它为什么需要发生。
任何关于解释代码的帮助或关于如何优化它以获得我想要达到的目标的建议都非常感谢。
解决方案
推荐阅读
- intellij-idea - IntelliJ:如何配置已经在版本控制下的字典?
- react-native - React Native:如何从子组件更改父组件的状态并重新渲染父组件?
- angular - 如何在角度 4 中验证日期
- java - 使用正确的数据值自动创建新的 Java 对象
- time - Fiware Cosmos OAuth2 Token 时间增加
- highcharts - Highchart:Flags 在设置极端时出现缺货图表
- excel - 在较长期间内找到较短的天数进行计算
- android - 为什么在 Constraintlayout 中为视图提供偏差约束会影响调整动画大小?
- android - 如何在蓝牙 POS 打印机中打印右对齐的文本?
- swagger - $ref 响应示例