Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小程序·云开发的HTTP API调用丨实战

小程序·云开发的HTTP API调用丨实战

原创
作者头像
腾讯云开发TCB
修改于 2019-09-19 10:50:44
修改于 2019-09-19 10:50:44
3.6K0
举报

小程序云开发之httpApi调用。

小程序云开发之httpApi调用(返回“47001处理”)

技术栈

代码语言:txt
AI代码解释
复制
采用 nodejs + express 搭建web服务器,采用 axios 请求第三方 httpApi

nodejs

express

axios

项目结构

通过应用生成器工具 express-generator 可以快速创建一个应用的骨架。

主要的核心文件 routes/base.js(api设置),util/rq.js(axios封装),views/base.pug(接口文档)

代码语言:txt
AI代码解释
复制
  
|---bin (框架生成,服务启动命令文件夹)
|---public (框架生成,静态资源存储)
|-------images
|-------javascripts
|-------stylesheets
|---routes (框架生成,路由配置/api)
|-------base.js // base相关接口及文档说明页
|---util (自行添加文件夹,放置公用js)
|-------result.js // 最终返回结果包装js
|-------rq.js // axios封装
|---views (框架生成,页面存放)
|-------error.pug
|-------base.pug (自行添加pug模板页面,用于base接口说明)
|-------index.pug
|-------layout.pug
|---app.js (框架生成,项目核心)
  • axios封装(util/rq.js)
代码语言:txt
AI代码解释
复制
// 模块引用
let axios = require("axios")
let qs = require("qs")

// 变量声明
const CONFKEY = "dev"
const BASECONF = {
    "dev":{
        baseUrl:'https://api.weixin.qq.com/',
    },
    "prod":{
        baseUrl:'https://api.weixin.qq.com/'
    }
}[CONFKEY]

// 创建rq请求并设置基础信息
const rq = axios.create({
    baseURL: BASECONF.baseUrl,
    timeout: 10000,
    headers: { // 请求头设置,(微信云开发数据APi采用application/json格式入参,否则导致47001错误)
        "Content-Type":"application/json; charset=utf-8"
    }
})

// axios 请求头拦截器
rq.interceptors.request.use(req => {
    // 有需要的,在此处拦截请求入参进行处理
    return req
},error => {
    return Promise.reject(error)
})

// axios 返回信息拦截器
rq.interceptors.response.use(res => {
    return res.data
},error => {
    return Promise.reject(error)
})

const $rq = { // 封装get,post请求

    get(url,params) { // axios.get(url,config)
        return rq.get(url,{
            params: params
        })
    },
    post(url,params={}) {
        return rq({ // axios(config)
            url: url,
            method: 'post',
            data:params
        })
    }
}

module.exports = {
    $rq
}
  • api设置 (routes/base.js)
代码语言:txt
AI代码解释
复制
var express = require('express');
var router = express.Router();
var { $rq } = require("../util/rq")
let result = require("../util/result.js")

/* GET base page. */
router.get('/', function(req, res, next) { // base pugApi说明文档
    res.render('base', { title: 'baseApi', 
        apiList:[
            {
                url:"base/getAccessToken(请求第三方Api,获取access_token)",
                method:"GET",
                params:{
                    key:"grant_type",
                    appid:"小程序appid",
                    secret: "小程序密钥"
                },
                result:{
                    "success": true,
                    "data":`{
                        "access_token":"23_w0OtD1X72LIQo4dwctVsp99kjtIRRk9Gw5bx7UOglotfL7k9LqB1gKbZw86CNht6cnCv9oKBcFEcPg5u4seXN0hJMSEocsbun2dQxCTyZarP06YcToVbdP-MOLc7o7EhMSzqR4URT__BdZc-NMLbAIARQP",
                        "expires_in":7200
                    }`
                }
            },
            {
                url:"base/getdatabase(获取指定云环境集合信息)",
                method:"post",
                params:{
                    env:"云开发数据库环境id",
                    limit:"获取数量限制,默认10",
                    offset:"偏移量,默认0"
                },
                result:{
                    "success": true,
                    "data":`{
                        {
                        "errcode": 0,
                        "errmsg": "ok",
                        "collections": [
                            {
                                "name": "geo",
                                "count": 13,
                                "size": 2469,
                                "index_count": 1,
                                "index_size": 36864
                            },
                            {
                                "name": "test_collection",
                                "count": 1,
                                "size": 67,
                                "index_count": 1,
                                "index_size": 16384
                            }
                        ],
                        "pager": {
                            "Offset": 0,
                            "Limit": 10,
                            "Total": 2
                        }
                      }
                    }`
                }
            }
        ]
    });
});

router.get('/getAccessToken', function(req, res, next) { // 请求第三方Api,获取access_token
    let urlParam = { // appID,secret信息最好是不暴露在外故在此处直接写死即可
        grant_type:"client_credential",
        appid: "appid",
        secret: "secret"
    };
    $rq.get("cgi-bin/token",urlParam).then(response=>{
        global.TOKEN_INFO = response // global nodejs 全局对象,占用内存
        let r =  result.createResult(true, response); // 返回结果包装成固定格式
        res.json(r);
    }).catch(err=>{
        let r =  result.createResult(false, err);
        res.json(r);
        console.log(err)
    })
});

router.get('/getdatabase', function(req, res, next) { // 获取指定云环境集合信息
    let urlParam = { // 获取access_token之后才能调用其他接口,其他接口的入参就无需传入access_token因为皆须要拼接在接口后
        // access_token: req.query.access_token?req.query.access_token:"",
        env: req.query.env?req.query.env:"test-3b6a08",
        limit: req.query.limit?req.query.limit:10,
        offset: req.query.offset?req.query.offset:0
    };
    $rq.post("tcb/databasecollectionget?access_token="+global.TOKEN_INFO.access_token,urlParam).then(response=>{
        let r =  result.createResult(true, response);
        res.json(r);
    }).catch(err=>{
        let r =  result.createResult(false, err);
        res.json(r);
        // console.log(err)
    })
});

module.exports = router;
  • 配置app.js 使路由及接口生效(仅)
代码语言:txt
AI代码解释
复制
var createError = require('http-errors'); // 处理错误
var express = require('express');
var path = require('path'); // 路径
var cookieParser = require('cookie-parser'); // cookie
var logger = require('morgan'); // 日志
var sassMiddleware = require('node-sass-middleware'); // sass 中间件

var indexRouter = require('./routes/index'); // index 路由
var baseRouter = require('./routes/base') // base 路由

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views')); // 设置视图根目录
app.set('view engine', 'pug'); // 使用 pug 模板

// 声明使用中间件
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(sassMiddleware({
  src: path.join(__dirname, 'public'),
  dest: path.join(__dirname, 'public'),
  indentedSyntax: true, // true = .sass and false = .scss
  sourceMap: true
}));
app.use(express.static(path.join(__dirname, 'public')));

app.all('/*',function (req, res, next) { // 解决跨越问题
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With');
  res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
  if (req.method == 'OPTIONS') {
    res.sendStatus(200);
  }
  else {
    next();
  }
});

// 声明路由
app.use('/', indexRouter);
app.use('/base', baseRouter);

// catch 404 and forward to error handler 自定义404中间件
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler 自定义错误抛出中间件
app.use(function(err, req, res, next) { 
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

至此,小程序云开发----httpApi调用已完成。

简单的利用vue+elementui做个云开发小程序后台管理页面调用下上面的接口

我们看下效果如下:

云开发小程序后台管理环境调整:

后台管理环境调整
后台管理环境调整

本地启动上面的接口服务及调用结果:

本地启动接口服务

本地启动接口服务
本地启动接口服务

本地接口调用结果

本地接口调用结果
本地接口调用结果

接口上传至服务器调用结果:

接口上传至服务器调用结果
接口上传至服务器调用结果
服务器调用结果]


至此小程序云开发----httpApi调用完工。

过程中遇到的问题
  • 在post获取数据库集合信息时,第三方返回错误码“47001”undefined在网上查了下,有很多遇到这个问题的。但如何解决说的大都不明不白,或者未解决,或者解决了帖子未更新。
  • 本人遇到该问题时,先是在官方社区搜索了相关提问,发现官方回复,在postman上尝试调用如果无恙请检查自身代码。
  • 依言自行在postMan上自行查验一波,发现我不论如何变更入参格式依然是“47001”的报错。此时我的入参如下:
代码语言:txt
AI代码解释
复制
 {

            access\_token:"获取到的access\_token",

            env: "云开发环境Id",

            limit: 10,

            offset: 0

        }
  • 多次查看对应httpApi文档,不断思索问题出在哪里。自身代码也没啥毛病啊,这是为啥呢?会不会是入参的问题呢?access_token已经在请求url上拼过一次是不是入参的时候就不需要了呢?入参的格式是什么呢?post默认的“application/x-www-form-urlencoded”,还是“application/json;”然后再一篇博客中看到,微信提供的接口入参格式为“application/json”。
  • 锁定了入参格式,但是再postMan上我是把所有的入参格式试了一遍的呀,那再试试入参里面去掉access_token呢?
  • ok,大功告成。终于见到了正常的返回数据。
  • 总结两点:

1、入参格式采用“application/json; charset=utf-8”;

2、需要拼接access_token的接口入参请干掉access_token如上文中的代码

联系我们

多云开发使用技巧及 Serverless 行业动态,扫码关注我们~

微信截图_20190729152259.png
微信截图_20190729152259.png

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
流动图书馆小程序实战
流动图书馆是一个图书漂流和借阅工具,旨在共享闲置图书,并链接趣味相投的小伙伴。
疯狂的小程序
2018/01/25
2.2K1
使用Node.js编写企业微信自建应用服务端
lyushine
2024/12/04
1710
在线商城项目17-登录态保持
前面我们实现了登入登出,一切看上去是没有什么问题,但是如果我们试着在登录情况下刷新一下页面。
love丁酥酥
2018/08/27
7860
在线商城项目17-登录态保持
Node.js学习笔记(三)——Node.js开发Web后台服务
Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。使用Node.js作为AngularJS开发Web服务器的最佳方式是使用Express模块。
张果
2022/09/28
8.1K0
Node.js学习笔记(三)——Node.js开发Web后台服务
​云开发·云调用生成小程序码
小程序云开发已经支持云调用,开放了很多接口,一直想要的获取小程序码也支持了。这下轻量的小程序也可以有自定义小程序码的功能。
PlayerYK
2020/10/29
1.6K0
​云开发·云调用生成小程序码
小程序开发技巧总结(三)-- 云开发时效数据刷新和存储 (access_token等)
小程序中经常有需要进行OCR识别,或者使用外部api例如百度AI识别等接口,请求调用这些接口需要令牌,即一些具有时效性的数据。本文以小程序云开发使用百度API接口为例,介绍access_token定时刷新和请求机制。
Kindear
2020/03/19
1.5K0
小程序开发技巧总结(三)-- 云开发时效数据刷新和存储 (access_token等)
用云开发制作教务助手小程序丨实战
本项目由一人承担从后端到前端的构思以及开发,下面我就讲讲从教务助手小程序的构思到开发实现(基于云开发)。
腾讯云开发TCB
2019/12/03
1.6K0
组员老是忘记打卡,我开发了一款小工具,让全组三个月全勤!
开始的时候我们都设置了一个打卡闹铃,下班后准时提醒,但有的时候加班,加完班回家又忘记打卡了。还有的时候迷之自信的以为自己打卡了,第二天看考勤记录发现没打卡。
杨成功
2022/12/19
1.7K0
组员老是忘记打卡,我开发了一款小工具,让全组三个月全勤!
微信普通H5接入腾讯云慧眼活体人脸核身SAAS服务
腾讯云慧眼人脸核身(原金融级身份认证升级版)是一组对用户身份信息真实性进行验证审核的服务套件,提供各类认证功能模块,包含证件 OCR 识别、活体检测、人脸1:1对比等能力,以解决行业内大量对用户身份信息核实的需求,广泛应用于金融、运营商、共享出行等领域。
周朋伟
2020/11/10
9.1K4
微信普通H5接入腾讯云慧眼活体人脸核身SAAS服务
小程序多入口对应指定客服的实现方案:小程序如何实现接入指定客服人员?
近年来,小程序已经成为众多企业与用户交互的高效工具。无论是电商、服务预约还是在线咨询,客服功能的引入显得尤为重要。而在小程序中,许多企业希望能够将客户直接引导至指定客服,以提升沟通效率和用户体验。那么,小程序究竟能否实现这一需求?本文将为你解答这一问题,并分析相关实现方式。
猫头虎
2024/12/10
4930
小程序多入口对应指定客服的实现方案:小程序如何实现接入指定客服人员?
Node.js 开发实践,前端工程师的 MVP 利器
本文经作者授权转载至公众号 “Nodejs技术栈”,作者:愚坤,掘金优秀作者,一名没上高中的前端工程师,目前就职水滴筹。 什么是 MVP,来自伟大的百科: Minimum Viable Product –最简化可实行产品。 是指以最低成本尽可能展现核心概念的产品策略,即是指用最快、最简明的方式建立一个可用的产品原型,这个原型要表达出你产品最终想要的效果,然后通过迭代来完善细节。该术语由弗兰克·罗宾逊和埃里克·里斯推广于Web应用程序 ,它也可能涉及到进行市场前手的分析。 前言: Node是前端工程师的贵人,
五月君
2020/11/30
9280
Node.js 开发实践,前端工程师的 MVP 利器
[猫头虎分享21天微信小程序基础入门教程]第21天:小程序的社交分享与消息推送
[猫头虎分享21天微信小程序基础入门教程]第21天:小程序的社交分享与消息推送
猫头虎
2024/06/01
1800
一步一步学Vue(八)
本篇完成如下场景: 1、系统包含首页、客户信息查询、登录三个模块 2、默认进入系统首页,如果要进行用户查询,则需要进行登录授权 3、查询用户后点击列表项,则进入详情页面 基于上述场景需求描述,在客户端我们考虑,需要设计如下组件:Home组件、客户列表组件、客户详情组件、登录组件 在服务器端考虑需要:用户认证服务;客户列表查询服务、客户详情查询服务。 ok,现在我们从上往下,先创建我们的基本目录结构, 当前目录结构如下: app.js node web 启动文件 node_modules node模块文件(关
Jerremy
2018/06/13
8170
【Vue3+TypeScript】CRM系统项目搭建之 — Axiox 网络请求封装
使用 vue 开发时,频繁使用到了 axios 这个网络请求库,这里对其做一个发起请求时携带参数方式的小结。
HelloWorldZ
2024/03/20
1940
【Vue3+TypeScript】CRM系统项目搭建之 — Axiox 网络请求封装
小程序·云开发之数据库自动备份丨云开发101
数据是无价的,我们通常会把重要的业务数据存放在数据库中,并需要对数据库做定时的自动备份工作,防止数据异常丢失,造成无法挽回的损失。
腾讯云开发TCB
2019/10/12
1.3K0
小程序-云开发-如何对敏感词进行过滤即内容安全的检测(上)
无论是小程序还是自行开发的一些类似社交,带有用户自行产生内容的软件应用,例如:即时通讯,社群,论坛,音视频直播等,对于接入内容安全的检测是非常有必要的
itclanCoder
2020/10/28
3.8K0
小程序-云开发-如何对敏感词进行过滤即内容安全的检测(上)
小程序开发 access_token 统一管理
对于使用过公众平台的API功能的开发者来说,access_token绝对不会陌生,它就像一个打开家门的钥匙,只要拿着它,就能使用公众平台绝大部分的API功能。因此,对于开发者而言,access_token的使用方式就变得尤其的重要。在日常API接口的运营中,经常遇到各种的疑问:为什么我的access_token突然非法了?为什么刚刚拿到的access_token,用了10min就过期了?对于这些疑问,我们提供出access_token的设计方案,便于开发者对access_token使用方式上的理解。
Kindear
2021/07/14
1.9K0
小程序开发 access_token 统一管理
使用Typescript实现轻量级Axios
文章首发于@careteen/axios(存放了下文涉及所有代码),转载注明来源即可。
Careteen
2022/02/14
3K0
使用Typescript实现轻量级Axios
vue+express生成token
express-jwt内部引用了jsonwebtoken,对其封装使用。在实际的项目中这两个都需要引用,他们两个的定位不一样。 jsonwebtoken是用来生成token给客户端的,express-jwt是用来验证token的。
江一铭
2022/06/18
9510
vue+express生成token
http网络编程(node版)
基础的东西总是很少人看,写起来也特别痛苦。不是因为它简单——恰恰是因为它太晦涩,太基础了——以至于没有人乐意用它来充实自己(装逼)。
一粒小麦
2019/07/18
1.3K0
http网络编程(node版)
推荐阅读
相关推荐
流动图书馆小程序实战
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档