Как сделать $ batch POST-запрос, используя Olingo v2 и Java - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь выполнить $ batch-запрос в 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--

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете использовать Olingo V2 в качестве клиента OData (хотя, на мой взгляд, довольно уродливый).На официальном сайте Olingo есть полное руководство по этому вопросу: Как использовать Apache Olingo в качестве клиентской библиотеки .

Olingo знает, как создавать запросы и анализировать ответы, но вам нуженмеханизм выполнения HTTP-вызовов.Я бы рекомендовал не полагаться на ручное открытие HttpURLConnections, как в приведенном выше примере, а вместо этого использовать что-то вроде Apache Http Client или какую-то другую выделенную библиотеку (чтобы уменьшить объем кода, который вы пишете, а такжеиметь доступ к более продвинутым концепциям, таким как опрос соединения).

В двух словах, вы должны сначала прочитать и проанализировать метаданные службы, которую вы хотите использовать:

// 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-запроса (method = "POST" и body = переменная payload).После этого вы можете проанализировать полученный ответ с помощью 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())

Наконец, вы можете использовать методы ввода , чтобы получить, например,свойства.

...