Coder Social home page Coder Social logo

vobu / sap-cf-destination Goto Github PK

View Code? Open in Web Editor NEW
12.0 2.0 5.0 320 KB

convenience module for querying a destination via a connectivity instance on SAP BTP Cloud Foundry

Home Page: https://blogs.sap.com/2018/11/21/scp-cloud-foundry-destinations-demystified/

License: Apache License 2.0

JavaScript 100.00%
sap cloudfoundry destination connectivity proxy nodejs

sap-cf-destination's Introduction

SAP BTP Cloud Foundry destination handler

Build Status npm Package

Install

npm install --save sap-cf-destination

Prerequisites

  • destination and destination instance created
  • connectivity instance created
  • xsuaa instance created
  • all of the above instances bound to the node app, e.g. via manifest.yml:
    applications:
    - name: my_app
      path: my_app
      memory: 128M
      services:
        - xsuaa-instance
        - connectivity-instance
        - destination-instance

Usage

const callDestination = require('sap-cf-destination');

// Promise chain
callDestination({
        url: '/api/json',
        connectivity_instance: 'connectivity-lite',
        uaa_instance: 'uaa-lite',
        destination_instance: 'destination-lite',
        destination_name: 'tbaas',
        http_verb: 'POST',
        payload: {
            "me": "here"
        }
    })
        .then(response => {
            // do sth clever from the response
            // of $server_behind_destination_'tbaas'/api/json
        })
        .catch(err => {
            // oh no ๐Ÿ’ฉ
        })
        
// async/await? ๐Ÿ‘
// add the 'async' keyword to an outer function wrapping 'callDestination'
async function getIt() {
    try {
        const response = await callDestination({...});
        // do sth clever w/ the response
    } catch (err) {
        // oh no ๐Ÿ’ฉ
    }
}

API

sap-cf-destination(options) โ‡’ Promise.<(any|never)>

Param Type Description
options Map configuration options for several CF service instances
options.url string the url to call in the destination, absolute path (including leading slash) e.g. /api/v1/json
options.connectivity_instance string name of the instance of the connectivity service
options.uaa_instance string name of the instance of the uaa service
options.destination_instance string name of the instance of the destination service
options.destination_name string name of the destination to use
options.http_verb 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS' HTTP method to use
[options.payload] object payload for POST, PUT or PATCH
[options.formData] object mimic a browser for POSTing a form to the destination; implies http verb POST
[options.content_type] string value for "Content-Type" http header, e.g. "application/json"
[options.full_response] boolean whether to have the full response (including all headers etc) pass through to the caller (BE -> proxy -> client)
[options.tech_error_only] boolean get a rejection only if the request failed for technical reasons, so e.g. 404 is considered a valid response
[options.binary] boolean whether to expect (and deliver) a binary at @param url
[options.scc_name] string Location ID of the SAP Cloud Connector

Hints & Limitations

  • all major HTTP verbs are supported (GET, POST, PUT,PATCH,HEAD, DELETE,OPTIONS) per se
    BUT: if the proxy software decides to not let any of them pass through, the request originating from this module will of course fail
  • POST, PUT and PATCH only support a JSON payload. The payload itself can be a plain, deeply nested object; it will be stringified automatically
  • POST now supports both a JSON payload and a form-style ("like a browser") submission:
    callDestination({
      url: ...,
      http_verb: 'POST',
      formData: {
        field1: "some value",
        field2: JSON.stringify([ { "el1": "v1", "el2": "v2" } ])  // stringify deep nested objects and array structures
      }
    })
  • use scc_name: '<locID>' as a parameter to specify location ID of the SAP Cloud Connector (default: none)
    callDestination({
            //...
            scc_name: '<locID of SCC>'
        }).then(...).catch(...);
  • use full_response: true as a parameter to obtain the full response payload, e.g. to get access to response headers
    callDestination({
            //...
            full_response: true
        }).then(...).catch(...);
  • use tech_error_only: true as a parameter to only get a rejection if the request failed for technial reasons ("as long as it has a status code, it's a valid response")
    callDestination({
            //...
            tech_error_only: true
        }).then( response => {
            // even โ˜•๏ธ ends up here
            // add
            //    full_response: true (see above)
            // to get response.statusCode
        }).catch( err => {
            // network layer problem or such
        });
  • do a download of a binary file by specifying the matching Content-Type of the file and setting binary to true;
    this will deliver a Buffer useable in writeStreams
    callDestination({
            //...
            content_type: 'application/zip',
            binary: true
        }).then( buffer => {
            // write Buffer
            fs.createWriteStream('file.zip')
              .write(buffer, 'binary')
              .end();
            // don't forget to listen to the error and finish event
            // ...
        }).catch(...);

License

Apache License 2.0

References

sap-cf-destination's People

Contributors

akshatmalhotra29 avatar dependabot-preview[bot] avatar vobu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

sap-cf-destination's Issues

Feature Request

Sometimes it's very useful to get all informations (like, url, type etc..) of a destination.
These infos are already used to call the destination, but not exposed.

I would like to suggest that these informations can be retrieved.

No Authentication in Backend Destination

Hi,

Currently is is referring to the "Basic Authentication" credentials maintained in the SAP backend in the Destination service. Basically, whatever the API/OData from the backend destination is exposed to cloud, there's no prompt for backend authorization, anyone can access to the data.

Is there plan to add Basic Authentication check if username and password is not added to the CF Destination cockpit?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.