我正在try 理解HTTP DELETE请求的行为.

在我的Java Web应用程序上,我定义了以下内容

@DeleteMapping("url/route")
public ResponseEntity<String> route(@RequestParam int param1, @RequestParam long param2, @RequestParam long param3, @RequestParam String param4) {
    System.out.println(param1 + "-" + param2 + "-" + param3 + "-" + param4 );
    return new ResponseEntity<String>(HttpStatus.OK);
}
    
@DeleteMapping("url/route2")
public ResponseEntity<String> route2(@RequestBody String body) {        
    System.out.println(body);
    return new ResponseEntity<String>(HttpStatus.OK);
}

在Java客户端上,我执行以下操作

public final void myFunction(final int param1, final long param2, final long param3, final String param4) {
    restTemplate.delete("http://localhost:8090/url/route?"
            + "param1=" + param1 + "&"
            + "param2="+ param2 + "&"
            + "param3=" + param3 + "&"
            + "param4=" + param4, String.class);
    
    restTemplate.delete("http://localhost:8090/url/route2", "SomeText", String.class);
}

第一个请求运行良好,日志(log)显示良好.但是,在第二种情况下,我得到以下错误

HttpMessageNotReadableException:缺少必需的请求正文: 公共org.springframework.http.ResponseEntity&lt;java.lang.String&gt; Com.thales.atm.thmi.microservice.CanvasController.deleteGraphicObject2(java.lang.String)]

我使用了Spring Boot(我的项目中的v2.7.1)模块Spring-Boot-starter-web.

有人能解释一下这个删除请求的正文参数用法有什么问题吗?

谢谢!

推荐答案

我使用的模块是Spring-Boot-starter-web of spring boot (v2.7.1 on my project).

根据MOST recent版本的REST模板,它只提供了以下delete个方法,这些方法都不希望向Http请求的request body发送entity AS参数.

无效删除(字符串url,映射<;字符串,?>;uriVariables)

无效删除(字符串url,对象...UriVariables)

无效删除(URI Url)

上述方法提供的URI变量有所不同.它们被传递,然后用来相应地修改URI.例如,如果您的URI是./some1/some2/{foo},那么您传递一个类似于2的uriVariable,它就是URI ./some1/some2/2.

这不是您所需要的,您目前没有其他 Select ,只能解决这个问题,因为它仍然是您可以支配的常规REST模板的exchange方法.

<T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> >  responseType, Object... uriVariables)

对给定的URI模板执行HTTP方法,将给定的请求实体&>写入请求,并将响应作为ResponseEntity返回.

这就是它的用法.

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.TEXT_PLAIN_VALUE);

HttpEntity<String> entity = new HttpEntity<String>("SomeText", headers);
restTemplate.exchange("http://localhost:8090/url/route2", HttpMethod.DELETE, entity, String.class);

Java相关问答推荐

在正确位置绘制多边形的PFA问题

如何让TaskView总是添加特定的列来进行排序?

为什么JFrame paint()多次绘制同一点(或根本不绘制)?

当列顺序更改时,Table View列列表的Change. wasPermanted()总是返回假

将偶数元素移动到数组的前面,同时保持相对顺序

如何粘合(合并)文件Lucene?

Java List with all combinations of 8 booleans

如何打印本系列的第n项y=-(1)-(1+2)+(1+2+3)+(1+2+3+4)-(1+2+3+4+5)...Java中的(1+2+3+4...+n)

Java中实现的归并排序算法给出ArrayIndexOutOfBound异常

Helidon 4和Http API

使SLF4J在Android中登录到Logcat,在测试中登录到控制台(Gradle依赖问题)

在添加AdMob时无法为Google Play构建应用程序包:JVM垃圾收集器崩溃和JVM内存耗尽

由于在生成器模式中使用泛型,lambda表达式中的返回类型错误

如果按钮符合某些期望,如何修改它的文本?

try 使用预准备语句占位符获取信息时出现Try-With-Resources错误

除0错误/抱歉我的句子是PT

使用for循环时出现堆栈溢出错误,但如果使用if块执行相同的操作,则不会产生错误

如何使用jooq更新记录?

持续时间--为什么在秒为负数的情况下还要做额外的工作?

在Spring Boot中使用咖啡因进行缓存