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

小程序云开发之httpApi调用。

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

技术栈

采用 nodejs + express 搭建web服务器,采用 axios 请求第三方 httpApi

nodejs
express
axios

项目结构

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

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

  
|---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)

// 模块引用
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)

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_tokenlet 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 使路由及接口生效(仅)

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 = .scsssourceMap: 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 developmentres.locals.message = err.message;res.locals.error = req.app.get('env') === 'development' ? err : {};// render the error pageres.status(err.status || 500);res.render('error');
});module.exports = app;

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

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

我们看下效果如下:

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

后台管理环境调整

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

本地启动接口服务

本地启动接口服务

本地接口调用结果

本地接口调用结果

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

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


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

过程中遇到的问题

  • 在post获取数据库集合信息时,第三方返回错误码“47001”
    在网上查了下,有很多遇到这个问题的。但如何解决说的大都不明不白,或者未解决,或者解决了帖子未更新。

  • 本人遇到该问题时,先是在官方社区搜索了相关提问,发现官方回复,在postman上尝试调用如果无恙请检查自身代码。

  • 依言自行在postMan上自行查验一波,发现我不论如何变更入参格式依然是“47001”的报错。此时我的入参如下:
{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如上文中的代码


如果你想要了解更多关于云开发CloudBase相关的技术故事/技术实战经验,请扫码关注【腾讯云云开发】公众号~
1649686-20190919182630921-96498999.png

转载于:https://www.cnblogs.com/CloudBase/p/11551625.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java hashCode() 和 equals()使用的场景

第3部分 hashCode() 的作用 hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。 hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCo…

坚守基本的职业信仰

深陷公司的政治斗争会让任何当事人都疲于奔命,尤其是当这种斗争的双方都是您的上级。除非您一开始就能够知道最终的斗争结果,否则任何具有倾向性的言行都会给自己带来难堪。 深陷入别人的职业斗争是一个职业经理人职业生涯最大的不幸,除非…

Zookeeper----基本原理

Zookeeper作用是什么? 协调分布式系统中的多个服务器,使得系统可以正常工作。 Zookeeper提供了什么? 实际上他只提供了三个东西,一个是文件系统,一个是通知机制,还有一个是集群管理机制 Zookeeper可以做什么…

Java 中 Comparable 和 Comparator 比较

Comparable 简介 Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通…

spgridview的过滤功能回调时发生错误~

代码中启用了过滤功能, 但当点击过滤的列时发生错误: error: spgridview_filtercallbackerrorhandler() was called - result 回调时发生错误... 详细见: HTML代码: AllowFiltering"True"FilterDataFields",Name,,…

web---SSL/TSL

对称加密 加密算法秘钥(双方持有相同的秘钥),A使用加密算法秘钥加密文件,B使用加密算法秘钥解密文件; 演示一个对称加密RC4算法 注意:RC4加密是有漏洞的 明文和秘钥进行异或得到密文,密文和秘钥…

讨论了好久的问题,IE、Firefox下CSS图片垂直居中的问题

通过百度和谷歌找了好久都没找着一个合适的方法。以下是自己找出的一种方法,自认为还可以,而且,也方便简单。IE:当容器为div,或者tr,只要把容器的Css属性line-height设置成容器的高度就行了.当容器为a,且容器的css属性display为inline-block或…

Nginx----实现https站点

1、首先给域名设置证书,可以去阿里云购买 1、下载自动化脚本 目的:帮我们自动在nginx配置中添加证书 yum install python2-certbot-nginx2、输入命令 certbot --nginx --nginx-server-root/usr/local/openresty/nginx/conf/ -d zy.com 选择我们的url请求…

TCP/IP四层模型和OSI七层模型的概念

TCP/IP四层模型 TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。TCP/IP协议簇分为四层,IP位于协议簇的第二层(对应OSI的第三层),TCP位于协议簇的第三层(对应OSI的第四层)。 TCP/IP通讯协议采用了4层的层级结构&…

setsockopt()用法(转载)

1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用 closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddrTRUE; setsockopt(s,SOL_SOCKET ,…

Nginx----OpenResty

概要 OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。OpenRestye通过汇聚各种设计精良的Nginx模块(主要由O…

《深入浅出Google Android》即将隆重上市!

《深入浅出 Google Android 》 作者在线答疑活动开始啦 :http://www.hiapk.com/bbs/forum-41-1.html 随着越来越多的手机 厂商和移动运营商加入了开放手机联盟, Android 平台 越来越受到广大开发 者的关注和推崇。 本书是是国内最早的 And…

MySQL两种引擎

Innodb引擎概述 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Inno…

公钥基础设施PKI体系介绍

PKI(Pubic Key Infrastructure)是一种遵循标准的利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范。用户可利用PKI平台提供的服务进行安全通信。 使用基于公钥技术系统的用户建立安全通信信任机制的基础是:网上进行的任何需要安全服务的通信都是建…

Flag counter被博客园禁了的解决方法

突然发现Flag counter展示不出来 一开始还以为是网速的问题,后来搜了搜才知道博客园把Flag counter禁了....之前的访问量全没了5555(虽然也没多少) 只好换一个记录访问量的好了:https://clustrmaps.com/ 进去之后创建账户 把网址贴…

ORM是什么?如何理解ORM

一、ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对…

oracle调整Lock_sga参数而不使用虚拟内存

由于几乎所有的操作系统都支持虚拟内存,所以即使我们使用的内存小于物理内存,也不能避免操作系统将SGA换到虚拟内存(SWAP)。所以我们可以尝试使得SGA锁定在物理内存中不被换到虚拟内存中,这样减少页面的换入和换出&…

Nginx----高级

Nginx请求流程 Nginx进程结构 Nginx有两种进程结构,一种是单进程(可以用于测试),一种是多进程(用于生产,默认) Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(work…

基于Zookeeper的分布式锁

实现分布式锁目前有三种流行方案,分别为基于数据库、Redis、Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开。我们来看下使用Zookeeper如何实现分布式锁。 什么是Zookeeper? Zookeeper(业界简…

诗歌rials 之RJS的tips

一些RJS的tips ruby代码 # do_magic.rjs page[:reviews].toggle page[:review_name].value "this is cool" page << "if ($(review_name).value foo) (" page.alert(hi foo!) page << ")" page.select("#reviews…