太阳集团5493conlogo

  • 微博
  • 微信
  • QQ好友
  • QQ空间
  • 百度
详细内容

案例 | 小程序开发如何调用 API 接口,以豆瓣电影为例-杭州微信小程序公众号直播商城开发为你转播

1.jpg


API 调用是开发者在小程序开发过程中经常会遇到的问题,本期我们以为调用豆瓣电影 API 为例具体来看 API 的调用过程以及常见的一些问题。


测试用到的小程序是「电影周周看」,内容来自清华大学软件学院刘强副教授在「学堂在线」上的小程序开发系列课程,想要学习更多课程,可以访问

http://www.xuetangx.com/courses/course-v1:TsinghuaX+2018032801X+2018_T1/about


本期内容要点如下:


2.jpg


简单了解豆瓣 API


为了简化课程讲解,我们将采取直接调用的方式,没有使用 OAuth2 的认证,也没有申请和使用对应的 apikey,所以这种调用会有比较严格的受限。


我们会以调用豆瓣电影条目信息 API 为例,这个 API 可以用来获取电影详情信息,具体怎么调用呢?

3.jpg

先来看下它的

URI:/v2/movie/subject/:id,

在这个目录下有一个冒号 id,这是一个 Restful 的 API 设计方式,就是将你要指定的目标电影的 id 直接在 URI 的路径中进行包含,而不是通过 querystring 的方式来指定。


我们通过浏览器来试一下这个 API 调用的结果。先输入豆瓣 API 的域名,再连接上 API 的路径,最后加上目标电影的 id,这里我们指定的是电影「教父」的 id 值 1291841 。


通过这样的一个 http request 请求返回的原始数据是一个 json 对象的格式文本,在它的 json 对象的格式中返回来很多对应的字段信息,比如 rating 反映了这部电影的各种评分,wish count 字段反映了有多少人想看这部电影,images 字段给出了三个不同尺寸的电影海报图片 URL,title 字段给出了电影的标题等等。



403 Forbidden 问题的干扰


在前面的逻辑中,每一次 detail 页打开,在它初始化的时候就能够从 options 参数对象中获取到本次要打开要展示的目标电影的 id,接下来就需要调用豆瓣的这个条目信息 API。将这个 id 传过来,然后由这个 API 返回 id 对应的电影详情数据。


前面我们看到过完整的 URL 是这个样子。



目标电影的 id 是直接 通过 URL 路径的一部分来直接进行传递的。所以这个地方的 data 属性我们不用定义,因为没捎带额外的数据,header 属性我们也不定义,method 参数默认用 GET 方法,因此也不指定。



那这里就指定了一个 success 的回调函数,我们先看一下它接收到的 response 对象会是什么,执行一下调用,返回的却是 403 Forbidden。


从返回的结果看,里面对应的「教父」电影的 id 值是 99 ,前面我们了解到「教父」电影的 id 值是 1291841, 替换正确的 id 后我们再调用一次。


这个时候我们得到了正确的 URL,它和我们刚才通过浏览器直接访问条目信息 API 时是一样的 URL。


通过浏览器直接访问能正确地获得对应的 json 对象文本,通过小程序 request 的方法调用API 返回的却是 403 Forbidden,这是什么原因?


这是因为,在今年年初,来自小程序的直接、公开的调用过多,豆瓣 APIserver 就将来自于小程序的直接调用给禁止了。


大家可能会问,那么豆瓣的 APIserver 怎么样判定对它的调用请求是来自于小程序呢?


小程序在它的每一个请求中都设置了固定的 Referer 的 header 字段,豆瓣的 APIserver 收到一个请求后,如果它发现这个 Referer header 的取值是小程序框架固定的格式,它就会直接返回一个 403 Forbidden 的 response。


那我们是否可以在 request 调用的时候通过定义 header 参数来修改对应的 Referer header 的取值?小程序框架它同时也将对 Referer  header 的设置给禁掉了,也就是说我们在 request 调用时,在 header 参数中来设置 Referer 的 header 也是无效的。


从这一点我们也可以看到,小程序对它的每一个 http 请求打上了自己的一个固定烙印,那么我们要怎么解决这个问题?


我们可以通过一个中间的服务器来对 Referer 的 header 进行重新设置,具体的,我们可以在小程序和豆瓣 API server 之间设置一个对应的 nginx 转发代理来实现。


我们在 nginx 转发代理中做一个page,将它接收到的 Referer 的 header 改成一个随便的值。nginx 转发代理收到小程序发送过来的请求后,会将小程序中固定住的 Referer  header 烙印给抹掉,然后再将 request 发送豆瓣 APIserver ,豆瓣 APIserver 会将这个请求当作普通的请求进行处理,这样一来就能正常地返回对应的详情数据。


因为小程序请求的每一服务器域名必须先进行 ICP 备案,然后才能在后台等级配置使用,在课程讲解的时候我们还来不及对自己的域名进行备案,所以我们就直接使用一个第三方的针对豆瓣  API 的转发代理。


我们将这个请求从原来的直接发送给都豆瓣 APIsever 改为先发给 nginx 转发代理。



运行之后,我们发现这次收到的是一个 400 bad request 的响应。这个问题又如何解决?


针对这个问题我们必须在请求的时候对 http 请求设置一个特定的 content type 的 header 的取值。



当我们将这个取值设置为 json 之后,本次 request 方法调用没有抛出任何错误,而且在 success 回调函数处理时显示的 是一个 200 OK 的 response。


并且在 data 属性中,我们成功地保存了本次 API 调用返回的目标电影详情数据对应的 json 文本对象转化而来的一个 javascript 对象,而它实际上就是对这个目标电影各个详情数据的一个封装。



在收到返回到目标电影详情数据之后,我们就可以将它保存到页面的一个内部状态数据中。


我们先通过 onload 方法的 this 指针将这个页面的页面对象的引用做一个保存,将其保存到一个 that 变量中,然后在 success 回调函数处理的时候直接通过 that 变量来获取外部页面对象的引用,接着,再访问其中的 setData 方法。


调用之后,我们在 APPdata type 中进行查看,最终在 detail 页面中找到了名为 movie 的内部状态变量,这其中就包含了这部电影对应的各种详情数据。



detail 页的具体展示


接下来我们就将接收到的详情数据渲染输出到视距图中进行展示。具体的展示办法就是通过新增的内部状态变量 movie 对电影详情对象中的相关属性进行数据绑定来实现。


我们将接收到的电影详情对象中的 summary 属性、 wish count 属性、collect count 属性等等都通过数据绑定的方式渲染输出到对应的元素上进行显示。



对 images 元素我们也可以将它的高度、宽度做一个设置,做一个简单的样式优化。


这时,我们再看看页面中的其他的两部电影,点击它们以后返回的是 404 Not Found。这是因为这两部电影的 id 并不是真实的豆瓣 id,因此豆瓣电影的 APIserver 就返回了一个 404 响应。


实际上这时候我们还是进入了 success 回调函数的处理,我们依然将接收到的 data 属性的取值保存到了内部状态变量 movie 中,所以这个时候 movie 的取值被保存成了这样的一个对象,但它不是一个正常的电影详情数据的对象,在这个对象中找不到我们需要的各种字段数据。



因此在一般处理中,我们需要单独做一个判断,只将返回的正常数据保存到内部状态变量中。我们再来判断一下它是不是一个 200 OK 的 response。



这个时候我们并没有在 detail 页上来新增这么一个内部状态变量 movie,而只有当这个电影能真正找到,返回的是一个 200 OK 的 response 的时候,对应的 movie 这个内部状态变量才有可能添加。


我们将其他两部电影的 id 都改为正确的值,之后再点击每一部电影,它对豆瓣 APIserver 的调用都能正常运行。


以上就是本期关于豆瓣电影 API 调用的全部内容。

18.jpg

太阳集团2138手机版
更多
  • Q3财报:有「新」有「增」-杭州网络公司

    Q3财报:有「新」有「增」-杭州网络公司

    腾讯2024年第三季度财报显示,期内:微信及WeChat的合并月活跃账户数13.82亿。财报还提到:视频号得益于广告主对视频号、小程序及微信搜一搜广告库存的强劲

  • 微信小店助手APP来啦,方便得很!-杭州

    微信小店助手APP来啦,方便得很!-杭州

    一个好消息!微信小店助手APP已正式上架各大应用市场,安卓/iOS都可!商家经营更方便啦~核心功能速览——1、小店的管理,移动端都能搞定支持在移动端进行商品、交

  • 港澳小程序交易翻倍,有商家月入八位数!-

    港澳小程序交易翻倍,有商家月入八位数!-

    10月24日,微信公开课·港澳专场在香港举办。聚焦于 “双向奔赴:新生态、新机遇” 这一主题,微信团队以及深耕港澳小程序的标杆商家、服务商齐聚,一起探讨了大湾区

  • 4个月销售额翻10倍,这家小众户外品牌怎

    4个月销售额翻10倍,这家小众户外品牌怎

    微信小店 Lafuma户外热这个小众品牌如何在视频号破圈?首场达播试水,销售额突破300万平均客单价1800元常态化直播带货,4个月实现月销售额翻10倍数据来自

  • 微信小店11.11好物节即将启动!三大带

    微信小店11.11好物节即将启动!三大带

    微信小店 11.11 好物节活动激励计划低门槛 高激励主播作为带货主播报名活动,并选择“购物”类目开播,累计成交数据满足对应目标门槛,即可在活动结束后获得对应电

  • 这个爬山搭子,十几万黄山游客都在用-杭州

    这个爬山搭子,十几万黄山游客都在用-杭州

    国庆假期就要来了,有人想去爬黄山吗?琐事缠身的你可能还没来得及做攻略,又或者没订到合适的酒店……没关系!现在,@黄山旅游官方平台 通过企业微信、小程序、视频号等

  • 小程序,玩法上“新”!-杭州抖音短视频直

    小程序,玩法上“新”!-杭州抖音短视频直

    这波上“新”,是新加坡的“新” !9月23日,微信公开课·新加坡专场启幕,微信团队奔赴狮城,携手新加坡旅游局以及当地多家标杆企业,一起探讨小程序在跨境生态下的新

  • 官宣:微信小店新商家激励政策-杭州微信小

    官宣:微信小店新商家激励政策-杭州微信小

    五大激励政策助力新商家成长微信小店新商家激励政策血降门槛0保证金试运营减成本前百万自营交易额的技术服务费率减至1%刘促增长新商家成长流量激励加福利开通运费险享「

  • 如何做出NB的视频号?-杭州网络公司为你

    如何做出NB的视频号?-杭州网络公司为你

    @闪电制片厂 @国翠儿 @时差岛 @王可乐说这些NB的视频号你刷到过吗?最近,他们和视频号一起在NB的城市宁波聚会,现场分享了创作秘籍,视频号官方和大家交流了短

  • 又贵又火,之禾视频号年销3000万-杭州

    又贵又火,之禾视频号年销3000万-杭州

    3000多的牛仔裤,5000一件的亚麻衬衫,上万一条的桑蚕丝连衣裙……来自上海的时装品牌之禾因为高定价而出圈,并且业绩还在持续攀升。曾有外媒报道称,2022年,

太阳集团5493con是一家专门致力于为企业提供全方位网站建设服务。年轻的我们带着梦想和对网络的热情走在互联网道路的前沿,一路走来,我们的努力和真诚得到了更多客户的认可。在未来的发在未来的发...

浙公网安备:33010602011153

seo seo