Я пытаюсь выполнить пакетный запрос $ на Java с помощью OData v2.
Пример запроса из браузера будет выглядеть примерно так, как показано ниже, между двойными кавычками. Но как я могу сделать этот запрос программно? Есть ли где-нибудь образец звонка? Любая помощь приветствуется.
Request URL: https://someUrl/project/odata/project/FOLDER/$batch
Request Method: POST
Status Code: 202 Accepted
Remote Address: 1.2.3.4:1234
Referrer Policy: no-referrer-when-downgrade
content-encoding: gzip
content-length: 5256
content-type: multipart/mixed; boundary=E828EB257B134AC6F567C8D3B67E666E1
dataserviceversion: 2.0
Accept: multipart/mixed
Accept-Encoding: gzip, deflate, br
Accept-Language: en
Connection: keep-alive
Content-Length: 595
Content-Type: multipart/mixed;boundary=batch_4edb-a2cd-948d
Cookie: project-usercontext=project-language=EN&project-client=100;
--Some cookie content--
DataServiceVersion: 2.0
Host: host.myClient.com:1234
MaxDataServiceVersion: 2.0
Origin: https://host.myClient.com:1234
Referer: https://host.myClient.com:1234/project/index.html
project-cancel-on-close: true
project-contextid-accept: header
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/1.2.3.4 Safari/537.36
x-csrf-token: 8Fd53yy2vuCjnaFKrZNuLg==
--batch_4edb-a2cd-948d
Content-Type: application/http
Content-Transfer-Encoding: binary
GET MyEntityDetailsSet HTTP/1.1
project-contextid-accept: header
Accept: application/json
Accept-Language: en
DataServiceVersion: 2.0
MaxDataServiceVersion: 2.0
project-cancel-on-close: true
> --batch_4edb-a2cd-948d
Content-Type: application/http
Content-Transfer-Encoding: binary
GET MyObjectSet HTTP/1.1
project-contextid-accept: header
Accept: application/json
Accept-Language: en
DataServiceVersion: 2.0
MaxDataServiceVersion: 2.0
project-cancel-on-close: true
--batch_4edb-a2cd-948d--




Вы можете использовать Olingo V2 в качестве клиента OData (хотя, на мой взгляд, он довольно уродливый). На официальном сайте Olingo есть полное руководство, посвященное этому использованию: Как использовать Apache Olingo в качестве клиентской библиотеки.
Olingo знает, как создавать запросы и анализировать ответы, но вам нужен базовый механизм для выполнения HTTP-вызовов. Я бы порекомендовал не полагаться на открытие HttpURLConnections вручную, как в приведенном выше примере, а вместо этого использовать что-то вроде Клиент Apache Http или другую выделенную библиотеку (чтобы уменьшить объем кода, который вы пишете, а также иметь доступ к более продвинутым концепциям, таким как опрос соединения).
Вкратце, вы должны сначала прочитать и проанализировать метаданные сервиса, который вы хотите использовать:
// content = read the metadata as an InputStream
Edm dataModel = EntityProvider.readMetadata(content, false);
Вы можете создать пакетный запрос через API свободного стиля:
BatchQueryPart part = BatchQueryPart.method("GET")
.uri("/Employees('1')")
.build();
// here you could have a larger list of parts, not just a singleton list
InputStream payload = EntityProvider.writeBatchRequest(
Collections.singletonList(part), "batch_boundary");
Затем вам нужно просто выполнить его, используя выбранный вами механизм выполнения HTTP-запроса (метод = "POST" и тело = переменная полезной нагрузки). После этого вы можете проанализировать полученный ответ с помощью Olingo:
// body = the response body received
// contentType = the Content-Type header received
List<BatchSingleResponse> responses =
EntityProvider.parseBatchResponse(responseBody, contentType);
// you can obtain the body for each request from the response list
String partBody = responses.get(0).getBody();
InputStream partStream = new ByteArrayInputStream(partBody.getBytes());
String partType = responses.get(0).getHeader(HttpHeaders.CONTENT_TYPE);
Наконец, используя Edm с первого шага, вы также можете анализировать каждое отдельное тело в зависимости от типа создаваемого вами запроса. Например, вы можете использовать метод readEntry для десериализации одного чтения объекта:
// first we have to find the entity set you used to make the request
EdmEntitySet entitySet = edm.getDefaultEntityContainer()
.getEntitySet("Employees");
ODataEntry entry = EntityProvider.readEntry(partType, entitySet,
partStream, EntityProviderReadProperties.init().build())
Наконец, вы можете использовать методы входа, чтобы получить, например, свойства.