2015-05-06 3 views
2

Я делаю POST до restlet и вам нужно вернуть zip-файл. Но хотя созданный файл является zip, метод возвращает тарабарщину.Ответ POST-ответа в zip-формате

я попытался обертывание FileRepresentation, как это было предложено here:

new org.restlet.engine.application.EncodeRepresentation(org.restlet.data.Encoding.ZIP, representation); 

А также пытался добавив Выдает аннотацию, как это:

@Produces({"application/x-zip-compressed"}) 

Но ни работы. Представление возвращается как строка тарабарщины, а заголовок Content-Type остается application/octet-stream. Что мне не хватает?

Это заголовки запросов. Обратите внимание на Accept-Encoding: gzip, deflate:

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 

Заголовки ответа:

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 

EDIT: Я также попытался изменить тип носителя при создании представления:

MediaType mt = MediaType.APPLICATION_ZIP; 
FileRepresentation fr = new FileRepresentation(file, mt); 

тип содержимого ответа изменен на Content-Type: application/zip но возвращаемое значение по-прежнему является талисманной строкой.

+0

Здравствуйте Eddy, вы могли бы точным, если вы используете расширение JAX-RS в Restlet? –

+0

Я экспериментировал с аннотацией Produces (javax.ws.rs.Produces), но это не решило проблему. – Eddy

ответ

1

Правильный способ сделать это то, что вы использовали:

public class MyServerResource extends ServerResource { 
    @Post 
    public Representation test(Representation repr) { 
     FileRepresentation outputRepresentation 
      = new FileRepresentation(new File("(...)"), 
          MediaType.APPLICATION_ZIP); 
     return outputRepresentation; 
    } 
} 

Так это должно работать.

Использования локона с таким кодом, вот что у меня есть:

$ curl -X POST http://localhost:8182/test > mycontent.zip 
$ unzip mycontent.zip 
Archive: mycontent.zip 
extracting: test.txt 

Кроме того, здесь есть то, что я с многословным режимом завитка:

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, если вы хотите настроить подсказки в диалоговом окне загрузки вашего браузера.

В противном случае «включить сжатие GZIP объекта ответа JSON на Resltet» соответствует автоматическому сжатию всего содержимого ответа с помощью Restlet. Браузеры поддерживают это и могут напрямую распаковывать контент перед его отображением. Я не думаю, что это не то, что вам нужно/ожидайте. Если это так, вас может заинтересовать эта ссылка: https://templth.wordpress.com/2015/02/23/optimizing-restlet-server-applications/.

Надеется, что это помогает, Тьерри

+0

не работает. Похоже, проблема может быть связана с типом контента, который отправляется автоматически. Не уверен. – Eddy

+0

Действительно странно! Был бы интересен m'y тестовый проект? FYI Я использовал стандартное приложение Restlet, а не рестарт JAX-RS ... Если вы используете JAX-RS, я могу попробовать попробовать эту технологию. –