首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zip格式的Restlet POST响应

zip格式的Restlet POST响应
EN

Stack Overflow用户
提问于 2015-05-06 23:53:09
回答 1查看 1.1K关注 0票数 2

我正在对restlet执行POST操作,需要返回一个压缩文件。但是,尽管创建的文件是zip文件,但该方法返回的是乱码。

我试着按照here:的建议包装FileRepresentation。

代码语言:javascript
复制
new org.restlet.engine.application.EncodeRepresentation(org.restlet.data.Encoding.ZIP, representation);

并尝试添加一个Produces注释,如下所示:

代码语言:javascript
复制
@Produces({"application/x-zip-compressed"})

但这两种方法都不起作用。表示以乱码字符串的形式返回,Content-Type头保持为application/octet-stream。我遗漏了什么?

这些是请求头。请注意Accept-Encoding: gzip, deflate

代码语言:javascript
复制
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36
Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
Content-Type: application/json 
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,he;q=0.6

响应报头:

代码语言:javascript
复制
Vary: Accept-Encoding
Last-Modified: Wed, 06 May 2015 14:49:03 GMT 
Content-Disposition: attachment; filename=_backup_20150506.zip; size=162191 
Date: Wed, 06 May 2015 14:49:03 GMT 
Accept-Ranges: bytes 
Server: Restlet-Framework/2.2.1 
Vary: Accept-Charset, Accept-Encoding, Accept-Language, Accept 
Set-Cookie: JSESSIONID=5F10BBBDC58D5C3D6C0474FA12C44FB9; Path=/AppName/; Domain=localhost 
Content-Encoding: gzip 
Content-Type: application/octet-stream 
Transfer-Encoding: chunked 

编辑:我在创建表示时也尝试了更改媒体类型:

代码语言:javascript
复制
MediaType mt = MediaType.APPLICATION_ZIP;
FileRepresentation fr = new FileRepresentation(file, mt);

响应内容类型更改为Content-Type: application/zip,但返回值仍然是乱码字符串。

EN

回答 1

Stack Overflow用户

发布于 2015-05-07 16:21:40

正确的方法是您使用的:

代码语言:javascript
复制
public class MyServerResource extends ServerResource {
    @Post
    public Representation test(Representation repr) {
        FileRepresentation outputRepresentation
             = new FileRepresentation(new File("(...)"),
                             MediaType.APPLICATION_ZIP);
        return outputRepresentation;
    }
}

所以这应该是可行的。

在使用curl和这样的代码时,下面是我所拥有的:

代码语言:javascript
复制
$ curl -X POST http://localhost:8182/test > mycontent.zip
$ unzip mycontent.zip 
Archive:  mycontent.zip
 extracting: test.txt

此外,下面是我对curl的详细模式的了解:

代码语言:javascript
复制
curl -X POST --verbose http://localhost:8182/test
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8182 (#0)
> POST /test HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8182
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-type: application/zip
< Last-modified: Thu, 07 May 2015 08:08:59 GMT
< Content-length: 134
* Server Restlet-Framework/2.3.1 is not blacklisted
< Server: Restlet-Framework/2.3.1
< Accept-ranges: bytes
< Vary: Accept-Charset, Accept-Encoding, Accept-Language, Accept
< Date: Thu, 07 May 2015 08:19:26 GMT
< 

请注意,如果您希望在浏览器的下载对话框中配置提示,则可以使用标题Disposition

否则,“在Resltet上启用JSON响应实体的GZIP压缩”对应于Restlet自动压缩整个响应内容。浏览器支持这一点,并且可以在显示之前直接解压缩内容。我不认为这不是你真正需要/期望的。如果是这样的话,你可能会对这个链接感兴趣:https://templth.wordpress.com/2015/02/23/optimizing-restlet-server-applications/

希望对你有帮助,蒂埃里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30081733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档