【问题标题】:Problem in sending HTTP PUT request using Apache HTTP client & Spring REST使用 Apache HTTP 客户端和 Spring REST 发送 HTTP PUT 请求时出现问题
【发布时间】:2020-09-23 09:32:36
【问题描述】:

我开发了一个简单的 REST API,它使用 Spring Boot 2.3.1.RELEASE 和 Oracle JDK 14 提供简单的 HTTP PUT 请求。下面是服务器端 REST 端点:

@Controller
@RequestMapping("/api/documents")
public class DocumentController {

   @PutMapping(value = "/setCurrentTenant", consumes = "multipart/form-data")
    public ResponseEntity<?> setCurrentTenant(
             @RequestParam(value = "documentId", required = false) Long documentId,
             @RequestParam("tenantId") Long tenantId) {
        return documentService.setCurrentTenant(documentId, tenantId);
    }
}

以及客户端代码:

HttpPut putRequest = new HttpPut("http://localhost:8080/api/document/setCurrentTenant");
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
    
builder.addTextBody("documentId", "1");
builder.addTextBody("tenantId", "10");
HttpEntity setCurrentTenantEntity = entityBuilder.build();
putRequest.setEntity(setCurrentTenantEntity);
httpClient = HttpClients.createDefault();
HttpResponse response = httpClient.execute(putRequest);

我尝试运行代码,一切正常,但是当客户端请求发送到服务器时,Spring 会记录如下异常:

Resolved [org.springframework.web.bind.MissingServletRequestParameterException:
 Required Long parameter 'tenantId' is not present]

我错过了什么吗?

【问题讨论】:

    标签: java spring rest apache-httpcomponents http-put


    【解决方案1】:

    您应该发送tenantId 作为请求参数,如

    http://localhost:8080/api/document/setCurrentTenant?tenantId=10

    我担心你为什么在不发送任何文件/二进制数据的情况下使用 multipart/form-data


    class TenantRequest {
      Long tenantId;
      Long documentId;
      //seter, getter
    }
    
    @PutMapping(value = "/setCurrentTenant", consumes = "multipart/form-data")
    public ResponseEntity<?> setCurrentTenant(TenantRequest request) {
     // TODO
    }
    

    @PutMapping(value = "/setCurrentTenant", consumes = "multipart/form-data")
    public ResponseEntity<?> setCurrentTenant(@ModelAttribute TenantRequest request) {
     // TODO
    }
    

    【讨论】:

    • 出于安全原因,它应该在请求中
    • 如果是这样你 RequestBody 或 ModelAttribute 注解并创建一个请求对象来映射请求参数
    • 这不是我的问题,我发现还有很多其他方法可以做到这一点。但是为什么在一切正常的情况下它不起作用??
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2012-08-15
    • 2015-04-26
    • 1970-01-01
    • 2018-05-04
    • 2022-12-25
    • 1970-01-01
    相关资源
    最近更新 更多