以微信小程序为例学习网站开发平台API调用

news/2024/5/9 16:45:44/文章来源:https://blog.csdn.net/weixin_33872660/article/details/88962448

一、引言

    相信各位码农们都有过要调用各大资源网站提供的API的经历,但是在接入的时候出现许多这样那样的问题,最近在做一个业界备受关注的微信小程序项目,使用了多个网站的API接入,接下来我就以“豆瓣电影”小程序的demo与大家分享下我在学习网站API使用的一些心得体会,本文为个人观点,如有不当之处,恳请批评指正。

二、.开发工具与资源平台

    1. [微信web开发者工具]:主要用于敲网页代码,但是最主要用来进行网页效果预览。我这里用的是微信web开发者工具0.19.191900,现在最新版本是0.20.191900版本,功能基本一样,没什么大变化,不过建议使用最新版本,功能功能更强大,操作更方便。2. [Atom编辑器]:主要用于布局排版,也是敲代码的主战场,真心觉得这个编辑器不错,快捷输入和排版,大大提高了开发效率,使用简单,一学就会。3. [微信小程序开发者文档]:微信小程序开发的文档,资源库,以及API规范4. [Iconfont-阿里巴巴矢量图标库]:提供项目中的所有图标,资源丰富。5. [野狗实时通信云wilddog]:提供项目中数据的存储以及通信功能,实现微信登录。6. [豆瓣开发者平台]:豆瓣电影的应用接口和开发规范说明文档

三、.目录结构展示

├── app.js
├── app.json
├── app.wxss
├── pages
│   ├── welcome
│   ├── mine
│   ├── comingSoon
│   └── top250
│   ├── detail
│   ├── search
│   ├── video
│   └── index
│   └── log
├── wilddog-weapp.js
├── images
└── utils└── util.js
"pages":[
"pages/welcome/welcome",            //电影首页
"pages/mine/mine",                  //我的信息页
"pages/comingSoon/comingSoon",    //近期上映列表页
"pages/inTheaters/inTheaters",     //热门电影列表页
"pages/top250/top250",         //top250电影列表页
"pages/detail/detail",           //电影详情页
"pages/search/list",            //电影搜索页
"pages/video/video"          //电影播放页
]

四、效果预览

项目github地址:https://github.com/webstormsh...

说明:由于项目中所有电影数据是通过请求豆瓣官方提供API远程获取,微信授权登录是通过第三方野狗平台实现,所以加载速度可能稍微有点慢,视频播放功能由于不能获得电影视频资源地址,所以电影播放页面使用了一个固定的视频资源地址访问。

五、项目实现功能列表

  电影首页查看栏目列表查看电影详情查看电影搜索查看电影播放暂停弹幕登录退出

六、项目难点解析

1.野狗平台API实现微信登录配置

野狗官方API文档引用:wilddog.App 对象是野狗 Web SDK 的核心,它维护着应用的全局上下文数据,不同模块之间需要通过它来
进行交互。同时 App 实例也是我们访问野狗各个功能模块的入口,所以初始化 App 实例是我们使用其他任
何 API 接口的前提。要使用野狗的身份认证功能,你的初始化参数中必须包含 authDomain, 代码如下:var config = {authDomain: "<appId>.wilddog.com"
};
wilddog.initializeApp(config);
初始化多个 App 实例
//上面的代码相当于如下初始化动作
var wilddog = wilddog.initializeApp(config);
//我们还可以使用不同配置声明多个不同的 App 实例
var configA = {authDomain: "<appId-a>.wilddog.com"
};
var a = wilddog.initializeApp(configA, "APP_A");
//通过 a 来访问 auth
//a.auth().signInXxx().then(...)**定义**  auth()
**说明**获取 wilddog.Auth 实例,wilddog.Auth 实例只能通过此方法获取。
**返回值**[wilddog.Auth](https://docs.wilddog.com/auth/Web/api/Auth.html)**定义**     sync()
**说明**   获取 wilddog.Sync 实例,wilddog.Sync 实例只能通过此方法获取。
**返回值**   [wilddog.Sync](https://docs.wilddog.com/sync/Web/api/App.html)

新手由于对微信小程序的的目录结构以及微信提供的API不熟悉,可能不知道怎样实现微信授权登录,在这里为了操作简便,本人使用了wilddog提供的接口,让第三方代理实现微信登录(操作详情见开发文档),而在项目中只需进行如下操作:
将wilddog-weapp-all.js拷贝到根目录下,并在js中进行如下配置:

App({
onLaunch: function () {
var config = {
syncURL : "https://sywx.wilddogio.com",      //这里写wilddog中新建的项目域名
authDomain:'sywx.wilddog.com'                  
}
wilddog.initializeApp(config)
this.ref = wilddog.sync().ref('todo')
},
login:function(callback){
console.log(callback);
wilddog.auth().signInWeapp().then(function(user){
callback(user);
wx.showToast({
title: '登录成功',
})
}).catch(function(err){
wx.showToast({
title: '登录失败',
})
})
},

2.豆瓣电影API获取电影信息
首先,应该要仔细阅读下豆瓣开发者平台的API文档,因为各个网站的提供的接口规范各不相同,所以需要搞明白他们使用的套路,我脑子不太好使,文档看了整整一天才搞明白;然后,在获取API链接的时候,应该注意不是所有的接口都全部开放的,有的数据无法获取,我试了好几个才找到能用的,所以在选择之前,应该提前测试以下是否可用,一般文档下面都会一个提供一个测试示例,最后在微信小程序中调用API的步骤可以参看下面项目中的代码:

//全局变量数据配置 
globalData:{userInfo:null,doubanBase:"https://api.douban.com",       //豆瓣电影api域名inTheaters:"/v2/movie/in_theaters",        //热门电影URIcomingSoon:"/v2/movie/coming_soon",       //最近上映URItop250:"/v2/movie/top250",                //top250电影URIdetail:"/v2/movie/subject/",              //电影详情URIsearch:"/v2/movie/search"                 //电影搜索URI}
//拼接请求电影列表的URL并调用获取方法onLoad:function(options){var comingSoonURL = app.globalData.doubanBase + app.globalData.comingSoon+ "?start=0&count=10";//  console.log(comingSoonURL);// 页面初始化 options为页面跳转所带来的参数this.getComingSoonListData(comingSoonURL,'comingSoon','近期上映');}
//获取近期上映电影列表并存放到data中getComingSoonListData:function(url,settedKey,categoryTitle){wx.showToast({title:"加载中",icon:'loading',duration:10000});var that = this;wx.request({url:url,method:'GET',header:{"Content-Type":"json",},success:function(res){that.setData({comingSoon:res.data.subjects,})}});}

3.微信小程序API实现视频播放
微信小程序自带媒体组件 video(视频)可以对视频媒体信息进行加载,播放等操作,并且可以对video组件的一些相关属性进行自定义,以下展示部分video组件的相关属性:

                              video组件属性部分列表属性名            类型             默认值          说明                                   
src              String                      要播放视频的资源地址
duration         Number                      指定视频时长                       
controls         Boolean           true      是否显示默认播放控件(播放/暂停按钮、播放进度、时间)
danmu-list       Object Array                弹幕列表
danmu-btn        Boolean          false      是否显示弹幕按钮,只在初始化时有效,不能动态变更
autoplay         Boolean          false      是否自动播放
loop             Boolean          false      是否循环播放
muted            Boolean          false      是否静音播放 
//电影播放页面的wxml文件
<!--pages/video/video.wxml-->
<view class="section tc"><video id="myVideo" src="http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400"   enable-danmu danmu-btn controls></video><view class="btn-area"><input bindblur="bindInputBlur" /><button bindtap="bindSendDanmu" type="primary">发送弹幕</button><button bindtap="bindStop" type="default" hidden="{{hiddenVideo}}">停止播放</button><button bindtap="bindplay" type="primary" hidden="{{!hiddenVideo}}">继续播放</button></view>
</view>
//电影播放页面的交互js文件
// pages/video/video.js
Page({data: {hiddenVideo:false},inputValue: '',bindInputBlur: function (e) {wx.login({success: function(res) {},fail: function(res) {},complete: function(res) {},})this.inputValue = e.detail.value},bindSendDanmu: function () {this.videoContext.sendDanmu({text: this.inputValue,color: getRandomColor()})},bindStop:function() {this.videoContext.pause();this.setData({hiddenVideo: true});},bindplay:function(){this.videoContext.play();this.setData({hiddenVideo: false});},onReady: function () {this.videoContext = wx.createVideoContext('myVideo')}
})
//随机生成颜色函数
function getRandomColor() {let rgb = []for (let i = 0; i < 3; ++i) {let color = Math.floor(Math.random() * 256).toString(16)color = color.length == 1 ? '0' + color : colorrgb.push(color)}return '#' + rgb.join('')
}

4.微信小程序调用野狗API登录

//微信小程序微信授权登录获取用户信息doLogin: function () {var that = this;wx.showModal({title: '登录',content: '是否允许微信授权登录',success: function (res) {if (res.confirm) {app.login(function (user) {console.log(user);that.setData({userText: user,status: '退出',displayInfo: 'block',hiddenInfo: 'none'})})}}})}
//退出登录,清楚本地用户信息
doLogout:function(){var that = this;wx.showActionSheet({itemList: ['退出', '重新登录'],success: function (res) {if (!res.cancel) {that.setData({userText: '',status: '登录',displayInfo: 'none',hiddenInfo: 'block'})}}})}

七、API应用心路历程

1.准确获取调用API的请求URL
其实,通过API对网站的数据资源进行访问的最关键就是根据业务需求准确无误的拼接出访问的URL链接,再调用访问方法将数据存储到data中,所以我们在拼接url时需要十分小心,注意细节,根据文档的要求规范URL链接形式,以下介绍一个项目中的例子说明:

//全局数据信息globalData:{userInfo:null,doubanBase:"https://api.douban.com",inTheaters:"/v2/movie/in_theaters",comingSoon:"/v2/movie/coming_soon",top250:"/v2/movie/top250",detail:"/v2/movie/subject/",search:"/v2/movie/search"}
// top250电影列表数据请求URL 
// "?start=0&count=10" 表示从0开始,取10条数据onLoad:function(options){
// 页面初始化 options为页面跳转所带来的参数var top250URL = app.globalData.doubanBase + app.globalData.top250 + "?start=0&count=10";console.log(top250URL );}

2.明确传递参数与返回值
在进行数据访问的时候,会带上一些参数,在使用带参数的链接时,我们应该特别注意页面跳转的起始位置,参数从一个页面传递到另一个页面,传递参数的格式要求,接收参数一般时在js的onLoad方法中,可以通过赋值的方式接收参数列表。而在调用方法的完成后一般都会有返回值,在对返回数据进行使用一定要先明确返回数据的类型及结构,返回值类型一般有number,boolean,object,Array等。

//电影搜索API部分文档信息
Domain:              https://api.douban.com/
Resources URI:       /v2/movie/search?q={text}
Example:            GET /v2/movie/search?q=张艺谋 GET /v2/movie/search?tag=喜剧
//关键字搜索电影列表请求URL
//?q=keyword表示将输入的关键字作为参数传入InputTap:function(e){var keyword = e.detail.value;var searchURL = app.globalData.doubanBase + app.globalData.search + "?q=" + keyword;console.log(searchURL);}

3.明确this,options,that等概念
在微信小程序的js文件中this关键字与在javascript中作用类似,都是指当前对象,但是微信小程序中的当前对象即为当前应用,在pages的页面获取方式:

var app = getApp();     /获取当前应用,之后可用this调用

js文件中的options参数

<!--pages/comingSoon/comingSoon.wxml-->
<block wx:for="{{comingSoon}}" wx:key=""><view class="scroll-view-item" >//点击跳转到制定带有参数的url页面<navigator url="/pages/detail/detail?id={{item.id}}"><image class="movie-img" src="{{item.images.large}}"/><view class="movie-name">{{item.title}}</view><view class="movie-grade"><view id="{{item.rating.average}}" class="commentStar" style="background-position-y:(10-{{item.rating.average}})*11px"></view><view id="movie-grade-value">{{item.rating.average}}</view></view></navigator></view>
</block>

options是从其他页面跳转到所现在页面链接中传递进来的参数,由于不确定传入参数的数量,这里的对象为一个数组。

// pages/detail/detail.js
//之前页面跳转到的页面,传递的参数被options接收
onLoad:function(options){var that = this;  //把this对象复制到临时变量thatconsole.log(options);     //打印出optios对象,参数列表var detailURL = app.globalData.doubanBase + app.globalData.detail + options.id;console.log(detailURL);},

上面的代码中用到了that,主要因为this会随着执行的上下文随时会变化,为了能找到原来页面的对象,在一开始将原始变量复制保存,这样有效的解决了数据丢失的问题。

4.利用控制台查看object结构
微信开发者工具不仅可以预览当前页面效果,也配备控制台,可以进行结果输出,我们在使用api访问数据的时候,可以通过使用console.log()输出对象查看对象的属性结构或者通过这种方式进行断点调试。以下给大家演示下我项目中控制台的查看结构操作:

Page({data:{},inTheaters: [],onLoad:function(options){var inTheatersURL = app.globalData.doubanBase + app.globalData.inTheaters + "?start=0&count=10";console.log(inTheatersURL);      //打印链接,控制台输出,通过点击访问,检测是否正确this.getMovieListData(inTheatersURL, 'inTheaters', '热门电影');},getMovieListData: function (url, settedKey, categoryTitle) {var that = this;wx.request({url: url,method: 'GET',header: {"Content-Type": "json",},success: function (res) {console.log(res.data);    //控制台打印通过API获取的object对象,可展开查看结构that.setData({inTheaters: res.data.subjects})}});}

控制台输出结果:

https://api.douban.com/v2/movie/in_theaters?start=0&count=10    
Object {count: 10, start: 0, total: 32, subjects: Array[10], title: "正在上映的电影-北京"}count: 10start: 0subjects: Array[10]0: Objectalt: "https://movie.douban.com/subject/26363254/"casts: Array[3]collect_count: 19015directors: Array[1]genres: Array[1]id: "26363254"images: Objectoriginal_title: "战狼2"rating: Objectsubtype: "movie"title: "战狼2"year: "2017"__proto__: Object1: Object2: Object3: Object4: Object5: Object6: Object7: Object8: Object9: Objectlength: 10__proto__: Array[0]title: "正在上映的电影-北京"total: 32__proto__: Object

单个对象的截图:

image.png

<!--pages/inTheaters/inTheaters.wxml-->
<block wx:for="{{inTheaters}}" wx:key=""><navigator url="/pages/detail/detail?id={{item.id}}"><view class="movie-list"><view class="movie-list-info" index="{{index}}"><!--电影图片--><image class="movieimg" src="{{item.images.large}}" /><view class="item-box"><view class="userinfo"><!--电影标题--><text class="movie-title">{{item.title}}</text><!--电影年份--><text class="time">{{item.year}}</text></view><!--电影评分--><view class="posts-title"><text>评分:{{item.rating.average}}</text></view><!--电影导演--><view class="bar-info-item-number">导演:{{item.directors[0]['name']}}</view><!--电影主演--><view class="bar-info-item-number">主演:{{item.casts[0].name}}{{item.casts[1].name}}</view></view></view></view></navigator></block>

5.高效调试代码
在进行开发过程中,程序出现bug是再正常不过的事,所以快速解决bug也是能力的体现,这里我在开发的过程中,遇到bug的解决办法一般的步骤是,首先在控制台查看报错信息,如果一眼就能反映过来最好,但如果看不懂意思,可以将报错信息复制粘贴到百度,查看解决办法,如果再不行的话,可以通过之前介绍的console.log()进行调试。一般做多了之后,只要一看报错就知道问题出在哪儿,所以多做多练是个不错的选择。

八、总 结

以上微信小程序Demo旨在实现一些基本功能,也存在一些不合理之处,如对项目有疑问或不同见解的同仁可与本人联系(邮箱:15797675808@163.com;QQ:1761775849)。学习是一个不断总结的过程,我希望我的一些学习心得体会对你有所帮助,但以上为我自己的个人见解,如有不当之处,欢迎评论区批评指正,学习是个不断改错的过程。

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

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

相关文章

Linux运维学习之LAMP搭建个人博客网站

从开始学习Linux&#xff0c;我就知道搭建博客&#xff0c;也很好奇怎么搭建的博客&#xff0c;今天终于学到了这个知识点&#xff0c;网上的很多的教程感觉都是含糊其辞&#xff0c;对于基础稍微有点薄弱的&#xff0c;根本实现不出来&#xff0c;而今天我就来篇基础教程&…

网站托管:关键词内页排名怎么做好?

网站优化如何实现关键词内页排名&#xff0c;关键词内页排名通俗一点就是长尾关键词排名。今天&#xff0c;网站托管小编给大家说说&#xff1a;如果我们研究网站的流量&#xff0c;我们会发现大多数流量是通过长尾关键词来的&#xff0c;而不是主关键词。因此研究网站内容关键…

百度或者Google---SEO优化

google和百度的技术差别: 1.百度还认不清哪个是原创的 2.google蜘蛛不够百度快 4.google排名结果随时变化 流量、权重、权威、内容、用户体验、用户关注度等等细节的排名&#xff0c;已表达了SEO的算法。 重要搜索引擎的网站登录入口地址: http://www.webmasterhome.cn/seo/add…

利用 NLB 和 DFS 为网站提供负载均衡和可用性

前序好久没有更新博客了。目前我在南京一家微软CPLS培训中心教授MCITP课程&#xff0c;至今已有半年多时间了。上个月本人也获得了微软认证讲师&#xff08;MCT&#xff09;认证&#xff0c;与此同时&#xff0c;我完成了高中三年的学业&#xff0c;并参加了2010年江苏高考。由…

借双慧眼识别钓鱼欺诈网站

借双慧眼识别钓鱼欺诈网站 钓鱼欺诈网站&#xff0c;又称仿冒网站。这些网站的内容主要是复制那些正常网站的内容&#xff0c;使得网民粗一看几乎和正常网站一模一样&#xff0c;区别仅限于浏览器的地址。 曾有新闻报道有骗子在北京街头做了个假ATM机&#xff0c;这ATM机和市民…

查看css的网站,网站查看代码css样式

网站查看代码css样式[2020-09-04 23:52:28] 简介:php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff1a;…

方维直播最新版服务端网站搭建3.1--1

准备资料&#xff1a; 备案的域名一个 腾讯云开通账户 腾讯云开通云直播 音视频服务 im 腾讯云密钥 短视频license【测试版或购买的版本】 一年1499 云直播license 【测试版或购买的版本】一年 2200 阿里云或腾讯云服务器【2g 4核心】 方维直播3.1版本安卓包 ios包 和 服务包…

由12306.cn谈谈网站性能技术

2019独角兽企业重金招聘Python工程师标准>>> 12306.cn网站挂了&#xff0c;被全国人民骂了。我这两天也在思考这个事&#xff0c;我想以这个事来粗略地和大家讨论一下网站性能的问题。因为仓促&#xff0c;而且完全基于本人有限的经验和了解&#xff0c;所以&#x…

IIS发布网站,报错404找不到文件或者目录

一般网上给了下面的几个方法&#xff1a; 首先基本设置中物理路径应该到网站文件中&#xff0c;比如你的网站文件夹是a&#xff0c;那么路径定义到\a 其次检查一下默认文档&#xff0c;默认文档第一个应该是你的首页的名字&#xff0c;比如index.asp。 最后检查一下是否权限问题…

织梦index.php可以替换,怎么去掉织梦网站首页带的index.html/index.php

方法1.1)在空间面板里面找到默认首页设置&#xff1a;我们是需要去掉index.html&#xff0c;这时我们只需要把index.html这个把它移到最顶级去就行&#xff0c;然后点击确定&#xff0c;在打开网站刷新下&#xff0c;就基本可以解决了&#xff01;其它的类似&#xff01;&#…

分享35个富有创意的蓝色网站设计作品

蓝色是网页设计中最流行的颜色之一&#xff0c;蓝色表现出一种美丽、冷静、理智、安详与广阔。由于蓝色沉稳的特性&#xff0c;具有理智、准确的意象&#xff0c;在商业设计中&#xff0c;强调科技&#xff0c;效率的商品或企业形象&#xff0c;大多选用蓝色当标准色。今天这篇…

使用Python实现网站图片抓取

1&#xff0c;Python环境 2&#xff0c;下面直接编写代码 import urllibimport reimport time def getHtml(url):page urllib.urlopen(url)html page.read()html html.decode(utf-8)return html def getImgUrl(html):str_re r<img[^>]src[\"\]([^\"\])[\&q…

推荐15个国外使用 CSS3 制作的漂亮网站

今天分享的作品集网站有些特别&#xff0c;因为他们都是使用 CSS3 技术制作的。对于设计师来说&#xff0c;为了吸引注意力&#xff0c;作品集必须展示出你的能力&#xff0c;这有点像制作简历&#xff0c;要让人们看到你所擅长的&#xff0c;突出的部分&#xff0c;这是一次推…

建设网站应该考虑哪些因素

2019独角兽企业重金招聘Python工程师标准>>> 对于中小企业和建站菜鸟来说&#xff0c;建设网站的过程的确有点复杂&#xff0c;有时候制作好网站然后再推倒重建&#xff0c;屡次再三仍不满意的事情经常发生。在这期间&#xff0c;网站制作和硬选购方面都可能成为推翻…

arcgis构建金字塔失败什么原因_【杭州南牛网络】导致网站SEO优化失败的原因是什么?...

【杭州南牛网络】在推进SEO外包的过程中&#xff0c;我们自己的问题或周边因素可能会导致SEO的失败&#xff0c;虽然成为SEO专家也会犯一些小的错误。接下来杭州南牛网络来说几个大家都容易犯的问题。1.目标设定不明确目标是计划实施的动力&#xff0c;但同时&#xff0c;目标也…

网站可以可以更换服务器数据库,云服务器上数据库更换

云服务器上数据库更换 内容精选换一换您可以通过导出SQL语句的方式将数据库备份到弹性云服务器上。弹性云服务器不限制存放哪些数据&#xff0c;但是数据必须符合国家法律法规。您可以在弹性云服务器上存放数据库备份&#xff0c;但不建议将弹性云服务器作为数据库备份空间使用…

hexo建站,下载主题,新建博客并分类

2019独角兽企业重金招聘Python工程师标准>>> 1、建站 hexo init myblog2、切换到新建的博客myblog下 cd myblog3、下载主题 git clone git://github.com/shenliyang/hexo-theme-snippet.git themes/snippet4、修改根目录下_config.yml language: zh-CN themes: snip…

设计师升职加薪必须知道的10个设计网站

设计行业经过几年的发展&#xff0c;已经进入到了相对成熟的时期。这无疑会对设计师有更高的要求和挑战。 随着AI的发展&#xff0c;设计甚至从有形的设计&#xff0c;转变为无形的设计。这就需要你对设计有更深刻的理解&#xff0c;理解设计的本质是沟通&#xff0c;设计源于人…

android wap网站自动适应

做个整理。 研究了一下新浪的wap网站&#xff0c;发现原来我们的head存在着这样的差异……<%page contentType"text/html;charsetUTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"><h…

web网站 Vs 移动App 谁更能打动你?之 产品经理篇

从web1.0到web2.0&#xff0c;由单调变为丰富——无论是内容&#xff0c;呈现&#xff0c;还是用户交互&#xff0c;当我们(接触互联网只有五六年的人)可能还沉浸在这绚丽多彩,啧啧称奇web交互体验之中&#xff0c;移动App不知道在什么时候已经悄然出现并成为受人追捧的焦点。我…