【问题标题】:How to execute DELETE and PUT methods in Java Servlets如何在 Java Servlet 中执行 DELETE 和 PUT 方法
【发布时间】:2020-03-22 08:49:10
【问题描述】:

我正在寻找任何方法来为 Java Servlet 运行 PUT 和 DELETE 方法。一般来说,我有一个简单的应用程序,它带有与 EJB 项目连接的 Web 控件 (WAR),该项目控制一个简单的库列表。 对于每个 CRUD 操作,我想使用不同的方法:

  • 通过 POST 创建,
  • 通过 GET 读取,
  • PUT 更新,
  • DELETE 删除

但是,我使用 post 方法通过简单的表单创建,读取(列表)是通过在 URL 地址中简单输入 GET 执行的(没有表单),但我不知道如何使用 put 和 delete 来实现它们的目的。

不幸的是,我找到的在线资源没有回答这个问题,但我只是很好奇如何使用 id。

我假设通过例如删除/Servlet/:libraryId(没有任何正文),由相同的 URL 架构更新(具有更新的架构)。 doPut()doDelete() 应该只在 EJB 中运行正确的操作。

【问题讨论】:

  • 我相信你知道,但是以防万一,现代浏览器不能向服务器发送任何请求,只能通过普通的 html 表单发送 GET 或 POST 方法。请参阅Why a browser only supports GET and POST HTTP methods? 了解更多信息。您可以使用 curl、wget 甚至 Postman 提交 PUT 和 DELETE 语句。
  • 好吧,我刚刚读过它,但我对它感兴趣,因为我在一些项目中作为前端(Angular)工作,如果我没有错,我们可以在那里运行 HttpClient.delete( ),它运行删除方法,我只是想知道我是否可以以某种方式使用它(即使假设在单击时编写其他方法只会触发具有正确主体的删除/放置方法)。
  • @gurioso,是的,他的版本有点变化,我几年前就开始使用这个版本了,它仍然只是很小的创造力;)
  • @gurioso,我会点击它,如果我的疑问会得到完全澄清;)

标签: java servlets war


【解决方案1】:

没有办法在 HTML 级别在表单提交中创建 DELETE 请求(它是 always GET 或 POST,除非您开始编写自己的浏览器来处理您提出的那种非标准 HTML),所有你可以做的是提交一个值(取自隐藏字段、单选按钮等),该值表示应在服务器上的 doPost()doGet() 处理程序中执行哪个操作。

但是,http protocol level 上的 DELETE 并没有什么特别之处。整个请求只是一个字节序列,其中first few定义了方法(PUT、GET、DELETE、PATCH...),然后是space等。

就您的服务器而言,您甚至可以使用web sockets 来接受连接并创建对自定义幻想方法的响应。如果您使用servlets,则无论如何您都可以使用doPut()、doGet() 和doDelete()。要处理其他 http 方法,您必须重写 service() 方法。

在客户端,Angular 的HttpClient 允许您需要的所有三种方法,您可以使用jquery's ajax,或者客户端上也有web socket approach,只要浏览器继续运行。

如果它是 Java 客户端,那么还有 web sockets(但您希望发送一些有效的 http 请求而不是“Hello”,如示例中所做的¹。)、HttpUrlConnectionApache HttpClient ,乍一看。

至于测试,除了 PUT 和 GET 之外,还有一些浏览器扩展可以让你编写请求,SoapUi 作为一个非常流行的工具,IntelliJ 甚至有一个http client,它允许你输入完整的请求纯文本。

¹如果您有一个同意这种“Hello”协议的hand crafted server,那也没关系。它只是不是http。


由于这个问题有些混乱,事实证明,我想进一步推广这个想法,用 webSockts 编写你自己的 Http 客户端/服务器。您已经为套接字的东西准备好了示例,所以这很容易。

但是更有趣的是,您处于构建 http 的原始 tcp/ip 级别,所有这些框架重定向(servlet,等等)都消失了,基本上只剩下一个文本(嗯,一个字节流),这就是http请求。所有的魔法都消失了,事情很明显很简单,只需as specified

【讨论】:

  • 嗯,我知道如何在 Angular 中做到这一点,也许我不清楚,但我只是想使用类似的解决方案,但使用 Java Web 应用程序,想知道我是否可以从 HTML 或任何地方运行只是那个删除;)关于SoapUi - 我可以使用Postman(我有时使用)来达到这个目的,但我仍然试图找到在java代码级别上对同一个servlet执行DELETE的方法(即使我会使用doPost 来自表单,它将隐藏带有操作的输入字段,然后使用诸如 HttpDelete 之类的东西并执行正确的 servlet 方法。
  • 我真的是 Java 初学者,我需要为我的学习准备程序(期望通过邮寄删除/更新,但我想知道:如何通过 put 和 delete + 不幸地做到这一点 - Netbeans),这部分是对如何使用某些东西等的好奇:D
  • 回到第一条评论:有没有机会(我现在无法检查),例如如果无法从表单运行 DELETE(对我来说没问题)以使用带有 POST 操作的表单,那只会在 doPost() 检查隐藏输入中给出的操作,然后在同一个 servlet 上从 doPost() 触发 HttpDelete()?我知道那是毫无意义的,我可以只使用来自doPost()doDelete() - 但再次 - 好奇心?
  • 我会考虑的,但不幸的是,最后几天我不确定我是否有足够的时间来做这样的事情,但是几个月前我为了一些项目目的而尝试接触一些 websockets(那是打字稿)。
  • 我的意思是这样的(有点简化,但我想你会明白的):(html)pastebin.com/yCpghztU(Servlet.java - 伪代码)pastebin.com/jTBFT9Un
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 2011-09-02
相关资源
最近更新 更多