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

posted @ 2017-04-11 17:59  WesChan  阅读(3884)  评论(0编辑  收藏  举报