You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:03:32