1.2.0 • Published 1 year ago

odata-batch v1.2.0

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

odata-batch

This module formats both the request and response of batch operations. It supports OData v2 but it may also support OData V3.

Install

npm install odata-batch --save

Example

You only need to generate an array with the requests you want to send, the requests will be returned in the same order as in the array.

const { ODataBatch } = require('odata-batch')

const calls = [
    {
        "method": "PUT",
        "url": "https://****",
        "data": {
            "__metadata": {
                "uri": "Candidate('200')"
            },
            "name": "Sebastian"
        }
    },
    {
        "method": "PUT",
        "url": "https://****",
        "data": {
            "__metadata": {
                "uri": "Candidate('201')"
            },
            "name": "Bruno"
        }
    },
    {
        "method": "POST",
        "url": "https://****",
        "data": {
            "__metadata": {
                "uri": "Candidate"
            },
            "name": "Test"
        }
    },
];

// Can add your own headers. Authorization header will be override auth param. Accept and Content-type headers will be ignored.
const headers = {
    'Accept-Charset': 'utf-8',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'en-US',
    'Cache-Control': 'no-cache'
};

const config = {
    url: `https://*****/$batch`,
    headers,
    auth: '******', // base64 string for basic auth
    calls,
};

var batchOperation = new ODataBatch(config);

batchOperation.send()
    .then(async function (a) {
        console.log(a);
    })
    .catch(function (e) {
        console.error(e);
    });

Extends

By default, axios is used as the HTTP connection library, but you can create your own adapter for your preferred HTTP library.

You need a class with a method send that will recieve necesary data for create the request and a class for format the batch response. Need as second param an object with data and headers. In method send of your class, you will recieve the next params:

  • url: url of your system
  • batchRequest: raw response from odata
  • config: an object with headers that we will use for batch request, add more configs if you need.
  • accept: is the response type in each individual batch subquery, is necessary for format correctly individual responses.
  • BatchParser: class that will parse the response.

Additionally, to respect the typescript typing, we use a createBatchResponse function to create the class, export it from the module.

ODataBatchAxiosRepository.ts

import axios, { AxiosRequestConfig } from 'axios';
import {
    ODataBatchRepository,
    createBatchResponse,
    BatchResponseConstructor
    } from "odata-batch";

export class ODataBatchAxiosRepository implements     ODataBatchRepository {
    async send(
        url: string,
        batchRequest: string,
        config: AxiosRequestConfig | undefined,
        accept: string,
        BatchParser: BatchResponseConstructor
    ): Promise<any> {

        const request = await axios.post(url,     batchRequest, config);

        console.log('from custom adapter');

        return createBatchResponse(BatchParser,     request, accept).response;
    }
}

Based in: