У меня есть следующий клиент, который я использую для вызова службы REST Джерси.Как получить XML-текст в качестве входного потока
public class JerseyClient {
public static void main(String[] args) {
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(getBaseURI());
String response = service.accept(MediaType.TEXT_XML)
.header("Content-Type", "text/xml; charset=UTF-8")
.entity(new File("E:/postx.xml"))
.post(String.class);
System.out.println(response);
}
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost:8080/MyService/rest/xmlServices/doSomething").build();
}
}
В настоящее время на стороне сервера У меня есть следующие:
@POST
@Path("/doSomething")
@Consumes(MediaType.TEXT_XML)
@Produces(MediaType.TEXT_XML)
public Response consumeXMLtoCreate(ProcessJAXBObject jaxbObject) {
Как изменить выше на стороне сервера код, так что я могу использовать Stax и поток один конкретный элемент на диск вместо преобразования всех в объектов в память. Моя цель - передать этот элемент, содержащий двоичные данные кодирования на диск.
Полезная нагрузка я получаю, как это:
<?xml version="1.0" encoding="utf-8"?> <ProcessRequest> <DeliveryDate>2015-12-13</DeliveryDate> <AttachmentBinary>iVBORw0KGgoAAAANSUhEUgAAAFoA</AttachmentBinary> <AttachmentBinary>iVBORw0KGgoAAAANSUhEUgAAAFoA</AttachmentBinary> </ProcessRequest>
После консультации с @ ВТД-XML-автора
теперь у меня есть следующие:
стороне сервера:
@POST
@Produces(MediaType.TEXT_XML)
@Path("/doSomething")
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
public Response consumeXMLtoCreate(@Context HttpServletRequest a_request,
@PathParam("fileId") long a_fileId,
InputStream a_fileInputStream) throws IOException {
InputStream is;
byte[] bytes = IOUtils.toByteArray(a_fileInputStream);
VTDGen vg = new VTDGen();
vg.setDoc(bytes);
try {
vg.parse(false);
} catch (EncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (EOFException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (EntityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
try {
ap.selectXPath("/ProcessRequest/BinaryAttachment/text()");
} catch (XPathParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int i=0;
try {
while((i=ap.evalXPath())!=-1){
//i points to text node of
String s = vn.toRawString(i);
System.out.println("HAHAHAHA:" + s);
// you need to decode them
}
} catch (XPathEvalException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NavException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
и на стороне клиента У меня есть следующее:
File file = new File("E:/postx.xml");
FileInputStream fileInStream = null;
fileInStream = new FileInputStream(file);
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(getBaseURI());
String tempImage = myfile.jpg;
String sContentDisposition = "attachment; filename=\"" + tempImage+"\"";
ClientResponse response = service.type(MediaType.APPLICATION_OCTET_STREAM)
.header("Content-Disposition", sContentDisposition)
.post(ClientResponse.class, fileInStream);
У меня возникли вопросы, возникающие из этого решения, во-первых, как именно я избегаю одинаковых проблем с памятью, если в итоге получится объект String в куче, который мне нужно декодировать?
Во-вторых, я могу восстановить объект или inputStream с помощью vtd-xml, как только я удалю элементы изображения, как я хотел бы обработать это с помощью JAXB?
Я считаю, метод XMLModifier remove() должен позволить мне иметь какой-то XML-представление минус элемент, который я сейчас записал на диск.
Является ли STAX синтаксическим анализом? Синтаксический анализ STAX не преобразуется в логику логики приложения ... это правда, он все еще преобразует XML во всевозможные временные объекты под капотом ... С другой стороны, vtd-xml не выполняет никакого преобразования объекта, он сохраняет XML, как он, и использовать его в качестве основы для произвольного доступа ... вы можете эффективно получить свою двоичную кодировку (я думаю (base64) с одним запросом xpath ... –
@ vtd-xml-author STaX не является обязательным требованием. информация о том, как я могу реализовать vtd-xml из входящего запроса, будет очень благодарна. –
Если вы можете расширить свой вопрос, включив в него некоторый XML, возможно, я смогу обрезать фрагмент кода, возможно, –