nodejs使用fetch获取WebAPI

在上一篇《Nodejs获取Azure Active Directory AccessToken》中,已经获取到了accessToken,现时需要获取WebAPI的数据,选择了node-fetch来获取数据

node-fetch是使用promise的写法,对于习惯了promise写法的人来说,还是非常容易的

这里提醒一下,公司上网是通过代理的方式来上网的,那么在获取外网的地址时,如果没通过代理,则获取不到数据,在这里,我加入了代理node-https-proxy-agent,关于使用,可以看文章最后的参考地址

var fetch = require('node-fetch');
var defaultConfig = require('../config/default.json');
var HttpsProxyAgent = require('https-proxy-agent');

module.exports = {
    searchGarmentStyle: function (garmentStyleNo, access_token) {
        var queryEntity = {
            "filterType": "LEAF",
            "filters": [{}],
            "attributeName": "item_number",
            "searchOperator": "eq",
            "filterValue": garmentStyleNo
        }

        var garmentstyles = [];
        // Set up the request
        return new Promise(function (resolve, reject) {
            try {
                //-------------------------------------------------------------------------------------------------------------

                fetch(defaultConfig.apiUrl.getGarmentStyleSigleApi,
                    {
                        agent: new HttpsProxyAgent('http://192.168.27.4:8083'),
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/json',
                            'Accept': 'application/json',
                            'Authorization': 'Bearer ' + access_token
                        },
                        body: JSON.stringify(queryEntity)
                    })
                    .then((response) => {
                        return response.json();
                    })
                    .then((responseJsonData) => {
                        var getresponse = responseJsonData;
                        if (getresponse.resultType === "SUCCESS") {
                            if (getresponse.results) {
                                if (getresponse.results[0].data) {
                                    var getdata = getresponse.results[0].data;

                                    for (let i = 0; i < getdata.length; i++) {
                                        garmentstyles.push(getdata[i]);
                                    }
                                    resolve(garmentstyles);
                                }
                                else {
                                    reject(new Error('WebAPI Error :resultType.results[0].data Value Is Null Or Empty'));
                                }
                            }
                            else {
                                reject(new Error('WebAPI Error :resultType.results Value Is Null Or Empty'));
                            }
                        }
                        else {
                            reject(new Error('WebAPI Error :resultType Value Is ' + getresponse.resultType));
                        }
                    })
                    .catch((error) => {
                        reject(new Error('WebAPI Error :' + error.message));
                    });

            } catch (e) {
                reject(e);
            }

        });
    }
};

调用(这里与获取token的方法进行合并):

var garmentstyle_helper = require('./service/garment_style_search');

//get token
adal_manage.getToken()
        .then((token_object) => {
                // console.log(token_object.accessToken);
                //call webapi
                garmentstyle_helper
                        .searchGarmentStyle(garmentStyleNo, token_object.accessToken)
                        .then((GarmentStyles) => {
                                if (GarmentStyles && GarmentStyles.length > 0) {
                                        //foreach data
                                        for (var getstyle of GarmentStyles) {
                                                // add message
                                                var message = new builder.Message()
                                                        .text(getstyle.linePlanProducts.productID + '(' + getstyle.linePlanProducts.productVersion + getstyle.linePlanProducts.productVersionSerialNo + ')')
                                                        .attachmentLayout(builder.AttachmentLayout.carousel)
                                                        .attachments(getstyle.linePlanProducts.productMaterialConfigs.map(garmentStyleColorwayAttachment));

                                                session.send(message);
                                        }

                                        session.endDialog();
                                }
                                else {
                                        // no found
                                        session.send('can not found garment style \"%s\"', garmentStyleNo);
                                        session.endDialog();
                                }
                        },
                        (err) => {
                                session.send('[searchGarmentStyle Error:]' + err.message ? err.message : '');
                                session.endDialog();
                        });
        }, (error) => {
                session.send('[getToken Error:]' + err.message ? err.message : '');
                session.endDialog();
        });

参考:https://github.com/bitinn/node-fetch

https://github.com/TooTallNate/node-https-proxy-agent