diff --git a/sop-sdk/sdk-nodejs-axios/.gitignore b/sop-sdk/sdk-nodejs-axios/.gitignore new file mode 100644 index 00000000..9ad28d23 --- /dev/null +++ b/sop-sdk/sdk-nodejs-axios/.gitignore @@ -0,0 +1,16 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json +tests/**/coverage/ + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/sop-sdk/sdk-nodejs-axios/common/OpenClient.js b/sop-sdk/sdk-nodejs-axios/common/OpenClient.js index d242a096..0dfd5c0a 100644 --- a/sop-sdk/sdk-nodejs-axios/common/OpenClient.js +++ b/sop-sdk/sdk-nodejs-axios/common/OpenClient.js @@ -1,11 +1,12 @@ const axios = require('axios'); -const formData = require('form-data'); const moment = require('moment'); const qs = require('qs'); -const {RequestType} = require('./RequestType'); -const {SignUtil} = require('./SignUtil'); -const {BaseRequest} = require('../request/BaseRequest'); +const RequestType = require('./RequestType'); +const SignUtil = require('./SignUtil'); +const BaseRequest = require('./BaseRequest'); + +const IS_RUN_IN_BROWSER = this === window; const HEADERS = {'Accept-Encoding': 'identity'}; @@ -56,7 +57,7 @@ const executeRequest = async (instance = {}, request, token, callback, {headers} data: undefined }; headers = getHeaders(headers); - const requestType = request.getRequestType(); + const requestType = request.getRealRequestType(); switch (requestType) { case RequestType.GET: { options.method = 'GET'; @@ -75,18 +76,31 @@ const executeRequest = async (instance = {}, request, token, callback, {headers} } break; case RequestType.POST_FILE: { - const formData = new formData(); - (request.files || []).forEach(({name, path}) => { - formData.append(name, path, { - contentType: 'application/octet-stream' - }); - }); Object.keys(params).forEach(key => { const value = params[key]; if (!(typeof key === 'undefined' || typeof value === 'undefined')) { formData.append(key, params[key]); } }); + let formData; + if (IS_RUN_IN_BROWSER) { + formData = new window.FormData() + (request.files || []).forEach(({name, path}) => { + formData.append(name, path, { + contentType: 'application/octet-stream' + }); + }); + } else { + const fs = require('fs'); + const fd = require('form-data'); + formData = new fd(); + (request.files || []).forEach(({name, path}) => { + formData.append(name, fs.createReadStream(path), { + contentType: 'application/octet-stream' + }); + }); + headers = Object.assign(headers, formData.getHeaders()); + } options.data = formData; } break; @@ -112,9 +126,24 @@ module.exports = class OpenClient { * @param url 请求url */ constructor(appId, privateKey, url) { - this.appId = appId; - this.privateKey = privateKey; - this.url = url; + this.appId = appId || ''; + this.privateKey = privateKey || ''; + this.url = url || ''; + } + + setAppId(appId) { + this.appId = appId || ''; + return this; + } + + setPrivateKey(privateKey) { + this.privateKey = privateKey || ''; + return this; + } + + setUrl(url) { + this.url = url || ''; + return this; } /** @@ -180,4 +209,4 @@ module.exports = class OpenClient { }); } -}; \ No newline at end of file +}; diff --git a/sop-sdk/sdk-nodejs-axios/common/RequestType.js b/sop-sdk/sdk-nodejs-axios/common/RequestType.js index 717d99f5..f745548d 100644 --- a/sop-sdk/sdk-nodejs-axios/common/RequestType.js +++ b/sop-sdk/sdk-nodejs-axios/common/RequestType.js @@ -1,4 +1,4 @@ -exports.RequestType = { +module.exports = { GET: 'GET', POST_FORM: 'POST_FORM', POST_JSON: 'POST_JSON', diff --git a/sop-sdk/sdk-nodejs-axios/common/SignUtil.js b/sop-sdk/sdk-nodejs-axios/common/SignUtil.js index 453b3dbe..98e2ceb6 100644 --- a/sop-sdk/sdk-nodejs-axios/common/SignUtil.js +++ b/sop-sdk/sdk-nodejs-axios/common/SignUtil.js @@ -11,7 +11,7 @@ const PEM_END = '\n-----END PRIVATE KEY-----'; /** * rsa签名参考:https://www.jianshu.com/p/145eab95322c */ -exports.SignUtil = { +module.exports = { /** * 创建签名 * @param params 请求参数 diff --git a/sop-sdk/sdk-nodejs-axios/main.js b/sop-sdk/sdk-nodejs-axios/main.js new file mode 100644 index 00000000..82fdac2f --- /dev/null +++ b/sop-sdk/sdk-nodejs-axios/main.js @@ -0,0 +1,44 @@ +const OpenClient = require('./common/OpenClient'); + +const StoryGetRequest = require('./request/StoryGetRequest'); + +// 应用ID +const appId = '2019032617262200001'; +// 应用私钥,2048位,PKCS8 +const privateKey = 'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXJv1pQFqWNA/++OYEV7WYXwexZK/J8LY1OWlP9X0T6wHFOvxNKRvMkJ5544SbgsJpVcvRDPrcxmhPbi/sAhdO4x2PiPKIz9Yni2OtYCCeaiE056B+e1O2jXoLeXbfi9fPivJZkxH/tb4xfLkH3bA8ZAQnQsoXA0SguykMRZntF0TndUfvDrLqwhlR8r5iRdZLB6F8o8qXH6UPDfNEnf/K8wX5T4EB1b8x8QJ7Ua4GcIUqeUxGHdQpzNbJdaQvoi06lgccmL+PHzminkFYON7alj1CjDN833j7QMHdPtS9l7B67fOU/p2LAAkPMtoVBfxQt9aFj7B8rEhGCz02iJIBAgMBAAECggEARqOuIpY0v6WtJBfmR3lGIOOokLrhfJrGTLF8CiZMQha+SRJ7/wOLPlsH9SbjPlopyViTXCuYwbzn2tdABigkBHYXxpDV6CJZjzmRZ+FY3S/0POlTFElGojYUJ3CooWiVfyUMhdg5vSuOq0oCny53woFrf32zPHYGiKdvU5Djku1onbDU0Lw8w+5tguuEZ76kZ/lUcccGy5978FFmYpzY/65RHCpvLiLqYyWTtaNT1aQ/9pw4jX9HO9NfdJ9gYFK8r/2f36ZE4hxluAfeOXQfRC/WhPmiw/ReUhxPznG/WgKaa/OaRtAx3inbQ+JuCND7uuKeRe4osP2jLPHPP6AUwQKBgQDUNu3BkLoKaimjGOjCTAwtp71g1oo+k5/uEInAo7lyEwpV0EuUMwLA/HCqUgR4K9pyYV+Oyb8d6f0+Hz0BMD92I2pqlXrD7xV2WzDvyXM3s63NvorRooKcyfd9i6ccMjAyTR2qfLkxv0hlbBbsPHz4BbU63xhTJp3Ghi0/ey/1HQKBgQC2VsgqC6ykfSidZUNLmQZe3J0p/Qf9VLkfrQ+xaHapOs6AzDU2H2osuysqXTLJHsGfrwVaTs00ER2z8ljTJPBUtNtOLrwNRlvgdnzyVAKHfOgDBGwJgiwpeE9voB1oAV/mXqSaUWNnuwlOIhvQEBwekqNyWvhLqC7nCAIhj3yvNQKBgQCqYbeec56LAhWP903Zwcj9VvG7sESqXUhIkUqoOkuIBTWFFIm54QLTA1tJxDQGb98heoCIWf5x/A3xNI98RsqNBX5JON6qNWjb7/dobitti3t99v/ptDp9u8JTMC7penoryLKK0Ty3bkan95Kn9SC42YxaSghzqkt+uvfVQgiNGQKBgGxU6P2aDAt6VNwWosHSe+d2WWXt8IZBhO9d6dn0f7ORvcjmCqNKTNGgrkewMZEuVcliueJquR47IROdY8qmwqcBAN7Vg2K7r7CPlTKAWTRYMJxCT1Hi5gwJb+CZF3+IeYqsJk2NF2s0w5WJTE70k1BSvQsfIzAIDz2yE1oPHvwVAoGAA6e+xQkVH4fMEph55RJIZ5goI4Y76BSvt2N5OKZKd4HtaV+eIhM3SDsVYRLIm9ZquJHMiZQGyUGnsvrKL6AAVNK7eQZCRDk9KQz+0GKOGqku0nOZjUbAu6A2/vtXAaAuFSFx1rUQVVjFulLexkXR3KcztL1Qu2k5pB6Si0K/uwQ='; +// 接口url +const url = 'http://localhost:8081'; + +// 创建客户端 +const openClient = new OpenClient().setUrl(url).setAppId(appId).setPrivateKey(privateKey); + +(async () => { + // 创建请求 + const request = new StoryGetRequest(); + + // 设置业务参数 + const bizModel = { + id: 111, + name: 'jim' + }; + request.setBizModel(bizModel); + + // 添加上传文件 + // 批量添加 + const files = [ + // name: 表单名称,path:文件全路径 + {name: 'file1', path: `${__dirname}/aa.txt`}, + {name: 'file2', path: `${__dirname}/bb.txt`} + ]; + request.setFiles(files); + // 单个添加 + request.addFile('file3', `${__dirname}/package.json`); + + const data = await openClient.executeSync(request); + // 成功 + if (!data.sub_code) { + console.log('成功', data); + } else { + console.error('失败', data); + } +})(); diff --git a/sop-sdk/sdk-nodejs-axios/readme.md b/sop-sdk/sdk-nodejs-axios/readme.md new file mode 100644 index 00000000..79b852e5 --- /dev/null +++ b/sop-sdk/sdk-nodejs-axios/readme.md @@ -0,0 +1,10 @@ +- 执行`npm install --registry=https://registry.npm.taobao.org` + +- 执行`node main.js`进行测试 + +## 封装步骤 + +1. 新建request类,继承BaseRequest,参考`StoryGetRequest.js` + +2. 调用接口,参考`main.js` + diff --git a/sop-sdk/sdk-nodejs-axios/request/StoryGetRequest.js b/sop-sdk/sdk-nodejs-axios/request/StoryGetRequest.js new file mode 100644 index 00000000..243084a7 --- /dev/null +++ b/sop-sdk/sdk-nodejs-axios/request/StoryGetRequest.js @@ -0,0 +1,19 @@ +const BaseRequest = require('../common/BaseRequest'); +const RequestType = require('../common/RequestType'); + +/** + * 创建一个请求类,继承BaseRequest,重写三个函数 + */ +module.exports = class StoryGetRequest extends BaseRequest { + getMethod() { + return 'story.get'; + } + + getVersion() { + return '1.0'; + } + + getRequestType() { + return RequestType.GET; + } +};