使用Spring RestTemplate提交带参数数据报错:Unexpected end of file from server
解决RestTemplate PUT请求出现"Unexpected end of file from server"错误
可能的原因及解决方案
1. 手动拼接JSON易导致格式错误
你当前手动拼接JSON字符串,一旦display.getBrightness()或display.getVolumelevel()是字符串类型(比如含特殊字符、空格),或者拼接时遗漏引号、括号,就会生成无效JSON。服务器解析失败后会提前关闭连接,触发"Unexpected end of file"错误。
修复方式:用对象/Map自动序列化JSON
- 方式一:创建DTO类
// 定义亮度请求DTO class BrightnessRequest { private int brightness; public BrightnessRequest(int brightness) { this.brightness = brightness; } // 生成getter方法 public int getBrightness() { return brightness; } } // 定义音量请求DTO class VolumeRequest { private int musicvolume; public VolumeRequest(int musicvolume) { this.musicvolume = musicvolume; } // 生成getter方法 public int getMusicvolume() { return musicvolume; } } // 使用示例 RestTemplate restTemplate = new RestTemplate(); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); String endPointURL = "http://"+ display.getIpaddress()+"/api/brightness"; HttpEntity<BrightnessRequest> request = new HttpEntity<>(new BrightnessRequest(display.getBrightness()), httpHeaders); // 服务器无响应体时,用Void.class作为响应类型 restTemplate.put(endPointURL, request, Void.class); String endPointURL1 = "http://"+ display.getIpaddress()+"/api/volume"; HttpEntity<VolumeRequest> request1 = new HttpEntity<>(new VolumeRequest(display.getVolumelevel()), httpHeaders); restTemplate.put(endPointURL1, request1, Void.class);
- 方式二:用HashMap快速构建请求体
RestTemplate restTemplate = new RestTemplate(); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); String endPointURL = "http://"+ display.getIpaddress()+"/api/brightness"; Map<String, Object> brightnessMap = new HashMap<>(); brightnessMap.put("brightness", display.getBrightness()); HttpEntity<Map<String, Object>> request = new HttpEntity<>(brightnessMap, httpHeaders); restTemplate.put(endPointURL, request, Void.class); String endPointURL1 = "http://"+ display.getIpaddress()+"/api/volume"; Map<String, Object> volumeMap = new HashMap<>(); volumeMap.put("musicvolume", display.getVolumelevel()); HttpEntity<Map<String, Object>> request1 = new HttpEntity<>(volumeMap, httpHeaders); restTemplate.put(endPointURL1, request1, Void.class);
2. RestTemplate PUT方法响应类型不匹配
如果服务器处理PUT请求后没有返回任何响应体,你指定String.class作为响应类型,RestTemplate会尝试读取不存在的响应内容,从而抛出EOF错误。
修复方式:改用Void.class作为响应类型
如上述代码所示,将restTemplate.put的第三个参数改为Void.class,明确告诉RestTemplate不需要解析响应体。
3. 排查网络和服务器问题
如果上述修复后仍报错,建议:
- 打印完整请求URL,确认IP地址和接口路径正确
- 用Postman/curl直接调用接口,验证服务器是否正常响应
- 给RestTemplate添加日志拦截器,打印请求头、请求体和响应详情,方便定位问题
// 添加日志拦截器示例 RestTemplate restTemplate = new RestTemplate(); ClientHttpRequestInterceptor interceptor = (request, body, execution) -> { System.out.println("Request URL: " + request.getURI()); System.out.println("Request Body: " + new String(body, StandardCharsets.UTF_8)); ClientHttpResponse response = execution.execute(request, body); System.out.println("Response Status: " + response.getStatusCode()); return response; }; restTemplate.getInterceptors().add(interceptor);
内容的提问来源于stack exchange,提问作者Anuja
相关产品推荐
相关产品推荐

