Java Dropwizard解压缩请求筛选器
我有一个dropwizard应用程序,其中客户端请求正文内容是gzip内容。我需要解压缩dropwizard应用程序中的内容。我有下面的代码,但是我在Java Dropwizard解压缩请求筛选器,java,jax-rs,gzip,dropwizard,Java,Jax Rs,Gzip,Dropwizard,我有一个dropwizard应用程序,其中客户端请求正文内容是gzip内容。我需要解压缩dropwizard应用程序中的内容。我有下面的代码,但是我在GZIPInputStream is=new GZIPInputStream(new ByteArrayInputStream(gzipBody))行中得到了一个异常java.io.EOFException 客户端正在发送以下请求 curl -XPOST -d @test.gz http://localhost:8080/save test.gz
GZIPInputStream is=new GZIPInputStream(new ByteArrayInputStream(gzipBody))行中得到了一个异常java.io.EOFException
客户端正在发送以下请求
curl -XPOST -d @test.gz http://localhost:8080/save
test.gz是通过以下步骤创建的
echo "hello world" > test
gzip test
代码本身是有效的。这个问题的问题是cURL请求。如果添加-v
(verbose)标志,您将看到问题
$curl-XPOST-v-d@test.gzhttp://localhost:8080/api/gzip/save
注意:不必要地使用-X或--request,POST已经推断出来。
*正在尝试::1。。。
*TCP_节点集
*已连接到本地主机(::1)端口8080(#0)
>POST/api/gzip/save HTTP/1.1
>主机:本地主机:8080
>用户代理:curl/7.54.0
>接受:*/*
>内容长度:8
>内容类型:application/x-www-form-urlencoded
问题在最后一行:内容类型
是应用程序/x-www-form-urlencoded
。不仅如此,文件中的数据也不会被发送。我不知道具体细节,但它与-d
标志有关。cURL的默认设置是在使用-d
标志时发送application/x-www-form-urlencoded
数据
我们应该做的是使用--data binary
选项而不是-d
,并将内容类型设置为应用程序/octet流
。这还将导致在服务器端调用正确的提供程序
curl-XPOST-v\
-H'内容类型:应用程序/八位字节流'\
--data binary@test.gz\
http://localhost:8080/api/gzip/save
为了确保我们的端点只接受application/octet-stream
,我们应该添加@Consumes
注释。这很重要,因为我们不希望调用随机提供程序,这会导致奇怪的错误消息
@POST
@Path("/save")
@Produces("application/json;charset=utf-8")
@Consumes("application/octet-stream")
public Response save(byte[] gzipBody) {
}
旁白
- 我不会对该方法使用
byte[]
参数。您并不真正希望将整个文件读入内存。确保示例已经读取它以获取字符串。但在实际应用程序中,最有可能的情况是将文件保存到某个地方。因此,不要使用byte[]
参数,只需使用InputStream
。您可以将该InputStream
传递给GZIPInputStream
构造函数
< P>上传文件时,请考虑使用MultPART。使用multipart,您不仅可以一次发送多个文件,还可以向文件中添加元数据。请参阅和(这不仅仅是围绕Jersey功能的捆绑包装器)
@POST
@Path("/save")
@Produces("application/json;charset=utf-8")
@Consumes("application/octet-stream")
public Response save(byte[] gzipBody) {
}