面试官:小程序与APP的通信方式,除了网络请求还有哪些?

unset

小程序(如微信小程序、支付宝小程序等)与微信或其他平台之间的数据交互,通常是通过平台提供的API来完成的。这些API允许小程序与微信服务器进行通信,从而获取微信方的数据。

小程序获取APP方数据的方式

以微信小程序为例

  1. 使用微信提供的API

    • 小程序提供了大量的API供开发者使用,这些API允许你获取用户信息、地理位置、设备信息等。
    • 例如,wx.getUserInfo 可以获取用户的基本信息,wx.getLocation 可以获取用户的地理位置。
  2. 调用微信服务器接口

    • 小程序可以通过wx.requestwx.cloud.callFunction等方式调用微信服务器提供的接口,获取更多的数据。
    • 例如,你可以调用微信的登录接口获取用户的OpenID和SessionKey,进而获取用户的微信信息。
  3. 使用云开发

    • 许多小程序平台(如微信小程序)提供了云开发功能,允许你在微信的云服务器上存储和获取数据。
    • 通过云函数,你可以直接在微信服务器上执行代码,获取或处理数据,然后返回给小程序。

App和小程序之间除了通过Ajax请求进行数据交换外,还可以使用以下方式进行数据交换:

  1. WebSockets:App和小程序可以通过WebSocket建立长连接,实现实时的双向通信。这种方式适用于需要快速实时更新数据的场景,例如即时聊天、实时多人协作等。

假设我们有一个社交类App和对应的小程序,用户在App中添加了新的好友,希望小程序能够实时接收到这个好友添加的通知。

  • 当用户在App中添加好友时,App会将相关信息(例如好友ID和名称)通过WebSocket连接发送到服务器端。

  • 小程序在启动时连接到相同的WebSocket服务器,等待接收来自App的事件通知。

  • 一旦App将好友添加的消息发送到服务器,服务器立即将该消息转发给已连接的小程序客户端。

  • 小程序收到来自WebSocket的消息后,立即显示好友添加的通知,从而实现了实时的事件通知与处理。

服务器端(使用Node.js和WebSocket库)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port8080 });

wss.on('connection'function connection(ws{
  ws.on('message'function incoming(message{
    // 处理来自App或小程序的消息
    wss.clients.forEach(function each(client{
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(message);
      }
    });
  });
});
App端(使用JavaScript的WebSocket API)
const ws = new WebSocket('ws://your-server-address:8080');

// 假设触发了添加好友事件,发送相关信息到服务器
ws.onopen = function() {
  ws.send('{"type": "friend_request", "friend_id": "12345", "friend_name": "Alice"}');
};
小程序端
// 小程序中使用wx.connectSocket建立连接,监听服务器推送的消息
wx.connectSocket({
  url'ws://your-server-address:8080'
});

wx.onSocketMessage(function(res{
  // 处理来自服务器的消息,如好友添加通知
});
  1. 跨平台框架提供的接口:一些跨平台开发框架(如React Native、Flutter)提供了专门用于App和小程序之间数据交换的接口。这些接口可以让开发者在应用中直接调用对方的API进行数据传输。
React Native
  1. Native Modules:

    • React Native 允许开发者编写原生模块,并通过 JavaScript 调用这些模块来执行原生代码。通过这种方式,可以在 App 中编写一个原生模块,以便小程序能够调用该模块提供的功能或数据。
  2. Bridge机制:

    • React Native 使用 Bridge 来进行跨语言通信,JavaScript 和原生代码之间的通信即是通过 Bridge 实现的。因此,可以通过 Bridge 在 App 和小程序之间进行数据交换,例如在小程序中调用 App 的特定功能或获取数据。
Flutter
  1. Platform channels:

    • Flutter 提供了 Platform channels,允许 Dart 代码与底层平台(如Android、iOS)进行通信。通过 Platform channels,可以在 App 和小程序之间建立通信渠道,实现跨平台的数据传输和功能调用。
  2. Method Channel:

    • Flutter 的 MethodChannel 允许在 Dart 与原生代码之间进行异步方法调用。这使得在 App 和小程序之间实现双向数据传输变得更加方便,例如小程序可以调用 App 中的特定功能或获取数据。
  3. 第三方后台服务:App和小程序可以通过第三方的后台服务进行数据交换。这种方式下,App和小程序分别与后台服务建立连接,并通过后台服务进行数据的存储和传输。

假设我们有一个社交类App和对应的小程序,用户在App中完成登录后,在小程序中希望能够实现基于相同认证状态的用户操作。

  • 用户在App中完成登录后,App使用OAuth协议向认证服务获取访问令牌(access token),并将该令牌存储到认证服务中。

  • 当用户在小程序中进入个人中心页面时,小程序向认证服务发送认证请求,并携带用户的访问令牌。

  • 认证服务接收到来自小程序的认证请求后,验证用户的访问令牌,并返回认证结果给小程序。

  • 小程序根据认证结果,决定是否展示用户的个人信息等操作,保证了用户在App和小程序之间的统一认证状态。

App端(使用OAuth 2.0协议)
// 假设使用OAuth 2.0进行认证,获取access token后存储到认证服务中
// 这里使用axios库进行HTTP请求
const axios = require('axios');

// 登录成功后,将access token存储到认证服务
axios.post('https://auth-service.com/store-token', {
  access_token'user_access_token',
  user_id'user_id'
});
小程序端
// 在小程序中发送认证请求并携带用户的access token
wx.request({
  url'https://auth-service.com/verify-token',
  method'POST',
  data: {
    access_token'user_access_token'
  },
  successfunction(res{
    // 处理认证结果,决定是否允许用户进行相关操作
  }
});
  1. 共享存储或缓存:App 与 小程序可以利用本地的共享存储或缓存来进行简单的数据交换。例如,可以使用本地存储来缓存数据,以便其他应用能够读取并使用这些数据。

假设我们有一个电商类App和对应的小程序,用户在App中下单后,希望小程序能够实时接收订单状态更新的通知,确保订单状态在两端保持一致。

  • 当用户在App中下单并且订单状态发生变化时,App将订单状态更新的消息发布到消息队列系统中,携带订单ID、新状态等相关信息。

  • 小程序连接到消息队列系统,并订阅与订单状态更新相关的消息主题,以便即时接收来自App的订单状态更新通知。

  • 一旦订单状态更新的消息被发布到消息队列系统,小程序立即接收到该消息,并进行订单状态更新处理,保证了订单状态在小程序上的实时性。

App端(使用Node.js和RabbitMQ)
// 使用amqplib库连接RabbitMQ并发布订单状态更新消息
const amqp = require('amqplib');

amqp.connect('amqp://localhost')
  .then(function(conn{
    return conn.createChannel();
  })
  .then(function(ch{
    const ex = 'order_exchange';
    ch.assertExchange(ex, 'fanout', { durablefalse });
    ch.publish(ex, '', Buffer.from('{"order_id": "12345", "status": "shipped"}'));
  })
  .catch(console.warn);
小程序端
// 使用 WebSocket 或者 HTTP 请求从消息队列系统获取消息
const socket = new WebSocket('ws://your-mq-server');
socket.onmessage = function(event{
  // 处理接收到的订单状态更新消息
};
  1. 消息队列:通过消息队列系统,App和小程序可以进行异步的数据交换。例如,当一个应用产生事件时,可以将相关信息发布到消息队列,而其他应用则可以订阅这些消息并进行相应的处理。
实现步骤
  1. 事件发布:当一个应用产生事件时,该应用将相关信息封装成消息并发布到消息队列中。这个过程通常由消息队列的生产者API来完成。

  2. 消息订阅:其他应用或组件可以通过消息队列的订阅功能,订阅感兴趣的消息主题或队列,并等待接收相关的消息。这一步骤通常由消息队列的消费者API来完成。

  3. 消息处理:一旦订阅的消息被发布到消息队列中,对应的订阅者或消费者即可接收到消息,并进行相应的处理,比如更新数据、执行特定的业务逻辑等操作。

  4. 保证消息完整性:消息队列系统通常会提供ACK机制来确保消息的可靠传输和处理。消费者需要发送ACK确认已成功处理该消息,以确保消息不会丢失。


最后

还没有使用过我们刷题网站(https://fe.ecool.fun/)或者前端面试题宝典的同学,如果近期准备或者正在找工作,千万不要错过,我们的题库主打无广告和更新快哦~。

老规矩,也给我们团队的辅导服务打个广告。