当前位置: 首页 > 知识库问答 >
问题:

如何在Jersey中为带或不带正文的POST请求创建endpoint

顾单弓
2023-03-14

我有一个用Jersey创建的API

当前有一个endpoint,用户可以向其发出POST请求。不需要正文,因为所有信息都在URL中。

@POST
@Path("entries")
@Produces(MEDIATYPE_JSON_AND_XML)
public Response createEntry(){
    ...
}

创建一个新的空条目并返回id。请求的内容类型并不重要,因为没有请求正文数据。

现在也可以在请求期间使用FormData设置新条目的特定字段。对于此请求,需要一个正文,并且content-type必须是multipart/form-data

所以我创建了第二个函数:

@POST
@Path("entries")
@Consumes("multipart/form-data");
@Produces(MEDIATYPE_JSON_AND_XML)
public Response createEntryWithParam(@FormDataParam('param') String param){
    ...
}

第二个函数的作用是发送请求中的参数。但如果添加它,第一个就会停止工作。

发送不包含content-type的请求将引发NullPointerException。可能是因为@consumes触发了某种content-type-check而失败。

有没有一种方法可以让一个endpoint接受带有或不带有请求体的POST请求?

因此,我希望在seconds函数中接收所有多部分/表单数据请求,并将第一个请求用作对该endpoint的其他POST请求的一种总括

共有1个答案

姚才捷
2023-03-14

目前我有一个解决办法。如果POST请求没有MediaType(Content-Type)或request-body进入,我会自动添加一个空的JSON对象并相应地设置Content-Type。

@Provider
public class ContentTypeRequestFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext crc) throws IOException {

        if (crc.getMethod().equals("POST") && crc.getMediaType() == null && crc.getLength() == -1){
            crc.getHeaders().add("content-type", MediaType.APPLICATION_JSON);

            InputStream in = IOUtils.toInputStream("{}");
            crc.setEntityStream(in);
        }
    }
}

这很管用,但在我看来有点怪怪的。我很有兴趣知道是否有更好的方法来达到我想要的结果。

 类似资料:
  • 问题内容: 我想通过PHP 在Blogger博客中添加帖子。Google提供了以下示例。如何在PHP中使用它? 您可以通过向带有帖子JSON正文的帖子集合URI发送POST请求来为博客添加帖子: 问题答案: 您需要使用cURL库发送此请求。 如果由于某种原因您不想/不想使用cURL,可以这样做:

  • 问题内容: 我想仅使用本机Python库将JSON编码的数据发送到服务器。我喜欢请求,但我根本无法使用它,因为我无法在运行脚本的计算机上使用它。我需要没有它。 我的服务器是本地WAMP服务器。我总是得到一个 urllib.error.HTTPError:HTTP错误500:内部服务器错误 我 100%确信 这 不是 服务器问题,因为在同一台计算机上,同一台服务器上的同一数据,相同的url与请求库和

  • 因此,我试图使用wiremck向带有请求正文的URL发出后请求,然后使用我的respons.json文件返回响应。(自定义响应) 我就是这样设置的,但我似乎找不到任何关于如何设置带有请求主体的post存根(包含数据,比如说尝试创建ID),然后检索自定义响应主体(从json文件创建ID响应)的信息。我该怎么设置呢。我尝试通过json文件请求生成id,然后尝试检索创建的id。 WithBodyFile

  • 问题内容: 我正在为我们的应用程序开发新的RESTful Web服务。 在某些实体上执行GET时,客户端可以请求实体的内容。如果他们想添加一些参数(例如,对列表进行排序),则可以在查询字符串中添加这些参数。 另外,我希望人们能够在请求正文中指定这些参数。 HTTP / 1.1似乎并未明确禁止这样做。这将使他们能够指定更多信息,可能使指定复杂的XML请求更加容易。 我的问题: 这是个好主意吗? HT

  • 问题内容: 我现在使用的代码: 似乎工作正常,但我不确定在将ByteBuffer返回池之前是否需要ByteBuffer。我什至不确定要使用。文档中没有太多关于它的内容。 问题答案: 读取请求正文的一种更简单的方法是将其分派到一个工作线程,该工作线程可以使用。 有两种方法:使用或文档中所示的调度模式。这是使用的示例: 在基本上没有派遣你。

  • 问题内容: 我需要将POST请求发送到包含gzip压缩请求参数的Web服务器。我使用的是Apache HttpClient,我已经读到它支持开箱即用的Gzip,但是我找不到任何有关如何做我需要的示例。如果有人可以发布一些示例,我将不胜感激。 问题答案: 您需要先将其转换为gzip 或(临时)。我们假设它不是一个很大的值,所以对于可用的JVM内存足够安全: 然后,可以使用HttpClient将其作为