Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dropwizard解压缩请求筛选器_Java_Jax Rs_Gzip_Dropwizard - Fatal编程技术网

Java 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

我有一个dropwizard应用程序,其中客户端请求正文内容是gzip内容。我需要解压缩dropwizard应用程序中的内容。我有下面的代码,但是我在
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) {

}