Как динамически вводить параметры REST API? - PullRequest
0 голосов
/ 26 июня 2018

Я работаю над проектом nodejs, где мне нужно сделать несколько вызовов API ms graph, чтобы получить некоторые данные.Некоторые примеры вызовов выглядят следующим образом:

https://graph.microsoft.com/v1.0/users/{userPrincipalName}/manager
https://graph.microsoft.com/beta/users/{userPrincipalName}/notebooks
https://graph.microsoft.com/v1.0/users/{userPrincipalName}/photo/

Моя цель состояла в том, чтобы каждый раз не использовать модуль запроса для вызова выше 3 apis и получения данных отдельно.Я хотел создать какую-то вспомогательную функцию, где я мог бы передать какой URL мне нужно использовать и что такое {userPrincipalName}

, поэтому я создал graphendpoints.js для хранения всех URL

module.exports = {
    manager: 'https://graph.microsoft.com/v1.0/users/userPrincipalName/manager',
    notebooks: 'https://graph.microsoft.com/beta/users/{userPrincipalName}/notebooks',
photo: 'https://graph.microsoft.com/v1.0/users/{userPrincipalName}/photo/'
  };

так я делаю вызов графа одной функцией по токену и URL-адресу.У меня не было каждого отдельного метода для выполнения запроса менеджера, записной книжки или фотографии и т. Д.

executeGraphApi: function (token, url) {
        return new Promise(function (resolve, reject) {
            let parsedBody = []
            request.get({
                    url: url,
                    headers: {
                        authorization: 'Bearer ' + token
                    }
                },
                function (err, response, body) {
                    if (err) {
                        reject(err)
                    } else {
                        parsedBody.push(JSON.parse(body).displayName)
                        resolve(parsedBody)
                    }
                })
        });
    }

вспомогательная функция runMSGraphApi (url) для вызова выше executeGraphApi (token, url)

var graphcallrunner = require('../../app/msgraph/graphcallrunner');
runMSGraphApi: function (url) {
        return new Promise(function (resolve,reject) {
            msGraph.getAccessToken()
                .then(function (token) {
                    graphcallrunner.executeGraphApi(token,url)
                        .then(function (results) {
                            resolve(results)
                        })
                        .catch(function (error) {
                            reject(error)
                        })
                })
                .catch(function (error) {
                    console.log(error);
                    reject(error)
                })
        })
    }

Потребитель этого выглядит следующим образом.Мне нужно было убедиться, что тот, кто хочет сделать вызов графа ms, просто использует runMSGraphApi () и передает правильный URL.

var graphendpoints = require('../../../msgraph/graphendpoints.js');
graphapihelper.runMSGraphApi(graphendpoints.manager),

Если вы видите выше, я выбрал вызов API api из graphendpoints.js и передал его вэтот URLЭтот URL на самом деле https://graph.microsoft.com/v1.0/users/{userPrincipalName}/manager

, где {userPrincipalName} не вводится.Как я могу динамически передать значение {userPrincipalName} в итоговую конструкцию url в executeGraphApi ().

https://graph.microsoft.com/v1.0/users/bob.bar@google.com/manager

1 Ответ

0 голосов
/ 26 июня 2018

Для этого можно использовать регулярное выражение

const endpoints = {
  manager: 'https://graph.microsoft.com/v1.0/users/userPrincipalName/manager',
  notebooks: 'https://graph.microsoft.com/beta/users/{userPrincipalName}/notebooks',
  photo: 'https://graph.microsoft.com/v1.0/users/{userPrincipalName}/photo/'
}

function parseUrl(url, params) {
  let result = url
  const regex = /(?<={)(.*)(?=})/
  const match = url.match(regex)

  if (match) {
    const replace = match[0]
    const value = params[replace]
    const holeThing = /{(?<={)(.*)(?=})}/
    if (value) {
      result = result.replace(holeThing, value);
    } else {
      throw new Error('Please specify the value for parsing the URL')
    }
  }
  return result
}

const url = parseUrl(endpoints.notebooks, {
  userPrincipalName: 'woof'
})

console.log(url)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...