Я только начал разрабатывать службы REST, но столкнулся с трудной ситуацией: отправка файлов из службы REST моему клиенту. До сих пор я научился отправлять простые типы данных (строки, целые числа и т. Д.), Но отправка файла - это другое дело, поскольку существует так много форматов файлов, что я не знаю, с чего начать. Моя служба REST создана на Java, и я использую Джерси, я отправляю все данные в формате JSON.
Я читал о кодировке base64, некоторые люди говорят, что это хороший метод, другие говорят, что это не из-за проблем с размером файла. Как правильно? Вот как выглядит простой класс ресурсов в моем проекте:
import java.sql.SQLException;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.UriInfo;
import com.mx.ipn.escom.testerRest.dao.TemaDao;
import com.mx.ipn.escom.testerRest.modelo.Tema;
@Path("/temas")
public class TemaResource {
@GET
@Produces({MediaType.APPLICATION_JSON})
public List<Tema> getTemas() throws SQLException{
TemaDao temaDao = new TemaDao();
List<Tema> temas=temaDao.getTemas();
temaDao.terminarSesion();
return temas;
}
}
Я предполагаю, что код для отправки файла будет примерно таким:
import java.sql.SQLException;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/resourceFiles")
public class FileResource {
@GET
@Produces({application/x-octet-stream})
public File getFiles() throws SQLException{ //I'm not really sure what kind of data type I should return
// Code for encoding the file or just send it in a data stream, I really don't know what should be done here
return file;
}
}
Какие аннотации мне следует использовать? Я видел, как некоторых людей рекомендуют @GET
использовать @Produces({application/x-octet-stream})
, это правильный путь? Файлы, которые я отправляю, являются конкретными, поэтому клиенту не нужно просматривать файлы. Может ли кто-нибудь объяснить мне, как мне отправить файл? Должен ли я кодировать его с помощью base64, чтобы отправить его как объект JSON? или кодировка не требуется, чтобы отправить его как объект JSON? Спасибо за любую помощь, которую вы можете оказать.
java.io.File
(или путь к файлу) на вашем сервере или данные поступают из какого-то другого источника, такого как база данных, веб-служба, вызов метода, возвращающийInputStream
?Ответы:
Я не рекомендую кодировать двоичные данные в base64 и оборачивать их в JSON. Это просто без нужды увеличит размер ответа и замедлит работу.
Просто обслуживайте данные своего файла с помощью GET и
application/octect-stream
одного из фабричных методовjavax.ws.rs.core.Response
(часть JAX-RS API, поэтому вы не привязаны к Джерси):Если у вас нет реального
File
объекта, ноInputStream
,Response.ok(entity, mediaType)
он тоже сможет справиться с этим.источник
ZipOutputStream
вместе с возвратомStreamingOutput
изgetFile()
. Таким образом вы получаете хорошо известный многофайловый формат, который большинство клиентов должно легко прочитать. Используйте сжатие, только если это имеет смысл для ваших данных, то есть не для предварительно сжатых файлов, таких как JPEG. На стороне клиента естьZipInputStream
возможность разобрать ответ.Если вы хотите вернуть файл для загрузки, особенно если вы хотите интегрироваться с некоторыми библиотеками javascript для загрузки / скачивания файлов, то код ниже должен выполнить эту работу:
источник
Измените адрес машины с localhost на IP-адрес, к которому должен подключаться ваш клиент, для вызова указанной ниже службы.
Клиент для вызова веб-службы REST:
Служба для ответа клиенту:
Требуется JAR:
WEB.XML:
источник
Поскольку вы используете JSON, я бы закодировал его в Base64 перед отправкой по сети.
Если файлы большие, попробуйте посмотреть BSON или другой формат, который лучше подходит для двоичных передач.
Вы также можете заархивировать файлы, если они хорошо сжимаются, перед их кодированием в base64.
источник
@Produces
содержать моя аннотация?