微信小程序http连接访问解决方案的示例


Posted in Javascript onNovember 05, 2018

HTTP + 加密 + 认证 + 完整性保护 = HTTPS,小程序考虑到信息安全的问题,选用了更为稳定安全的https 来进行信息传递。

HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

这就导致了许多好用的http  API无法在小程序中被调用。

但是也有解决方案。

1.中继访问

微信小程序http连接访问解决方案的示例

中继访问有两种方式,一种需要自己拥有一个云服务和域名。

拥有域名和云服务器

域名完成备案之后下载证书

https指引教程如下------>

再讲域名解析到你的云服务器的IP。

这样子你的域名就是https的了,小程序可以访问你的服务器了,现在就开始在云服务上实现访问http API 服务

实际上只需要面向小程序和API Server 做一个双面响应即可。

微信小程序http连接访问解决方案的示例

实现这种功能,显而易见,在服务器上部署一个Web项目是最简单的实现方式:

我们以访问豆瓣图书API 为例:https://api.douban.com/v2/book/isbn/

豆瓣API虽然是https的,但是来自小程序的访问是被禁止的。下面代码同样适用于http 连接

Java代码:

这个是 通用代码 ,无论是访问什么API

package DataService;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.HttpURLConnection;

import java.net.URL;

import java.net.URLConnection;

import java.sql.ResultSet;

 

import com.google.gson.Gson;

 

/*

 * Author:陈浩东

 * QQ:1025584691

 */

public class DouBanBook {

  //豆瓣接口实现

  public static String doPost(String url, String params, Integer connTimeout, Integer readTimeout, String contentType)

  {

    PrintWriter out = null;

    BufferedReader in = null;

    String result = "";

    try

    {

      URL realUrl = new URL(url);

      // 打开和URL之间的连接,根据url

      URLConnection conn = realUrl.openConnection();

      // 设置通用的请求属性

      conn.setRequestProperty("accept", "*/*");

      conn.setRequestProperty("connection", "Keep-Alive");

      conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

      conn.setRequestProperty("Content-Type", contentType == null? "application/json" : contentType);

      // 发送POST请求必须设置如下两行

      conn.setDoOutput(true);

      conn.setDoInput(true);

   

      // 设置请求超时时间和读取超时时间

      conn.setConnectTimeout(connTimeout == null ? 180 : connTimeout);

      conn.setReadTimeout(readTimeout == null ? 180 : readTimeout);

   

      // 获取URLConnection对象对应的输出流,设置utf-8编码

      out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8"));

      // 发送请求参数

      out.print(params);

      // flush输出流的缓冲

      out.flush();

      // 定义BufferedReader输入流来读取URL的响应,设置utf-8编码

      in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));

      String line;

      while ((line = in.readLine()) != null)

        result += line;

    }

    catch (Exception e)

    {

      e.printStackTrace();

      result = null;

    }

    //使用finally块来关闭输出流、输入流

    finally

    {

      try

      {

        if (out != null)

        {

          out.close();

        }

        if (in != null)

        {

          in.close();

        }

      }

      catch (IOException ex)

      {

        ex.printStackTrace();

      }

    }

    return result;

  }

}

根据访问不同的API,只需要修改Servlet的写法就可以:

Servlet:

package Servlet;

 

import java.io.IOException;

import java.io.Writer;

import java.util.HashMap;

import java.util.Map;

 

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import com.google.gson.Gson;

 

import DataService.DouBanBook;

 

/**

 * Servlet implementation class doubanbook

 */

@WebServlet("/doubanbook")

public class doubanbook extends HttpServlet {

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

     request.setCharacterEncoding("utf-8");

      response.setContentType("text/html;charset=utf-8");

      response.setHeader("Access-Control-Allow-Origin", "*");

      response.setHeader("Access-Control-Allow-Methods", "GET,POST");

      String isbn = request.getParameter("isbn")==null?"no":request.getParameter("isbn");

      String sshpwd = request.getParameter("ssh_secret")==null?"no":request.getParameter("ssh_secret");

      System.out.println(sshpwd);

      System.out.println(isbn);

      Map<String, Object> result = new HashMap<String, Object>();

      String json = new Gson().toJson(result);

      Writer out = response.getWriter();

      out.write(DouBanBook.doPost("https://api.douban.com/v2/book/isbn/"+isbn, null, null, null, null));

   

      out.flush();

  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    // TODO Auto-generated method stub

    doGet(request, response);

  }

}

同样,你也可以用Python,php等语言来实现中继访问这个功能。

无域名和云服务器

对于个人开发者来说,尤其是学生来说,又是是没有条件购买长时间的云服务器的,这个时候我们如果是开发小程序的话,可以用他们提供的空间。

使用微信小程序的云开发能力,Node.js 函数,用js 实现服务端的响应,访问非https API。

参照写法一:

云函数调用方式访问API

const cloud = require('wx-server-sdk')

 

cloud.init()

 

// 云函数入口函数

exports.main = async (event, context) => {

 console.log(event)

 console.log(context)

 

 return new Promise((resolve, reject) => {

 

  var url = event.url;//前端小程序传的data

 

  var https = require('https');

  https.get(url, function (res) {

   var size = 0;

   var chunks = [];

   res.on('data', function (chunk) {

    size += chunk.length;

    chunks.push(chunk);

   });

   res.on('end', function () {

    var data = Buffer.concat(chunks, size).toString();

    console.log(data)

    resolve(JSON.parse(data))

   });

  }).on('error', (e) => {

   console.log(`url:${url} error: ${e.message}`);

  });

 })

}

不知道什么原因,云函数我感觉并不是很稳定,建议有条件的还是用自己的服务器来实现吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
FF IE浏览器修改标签透明度的方法
Jan 27 Javascript
JS 对象属性相关(检查属性、枚举属性等)
Apr 05 Javascript
在JavaScript中如何解决用execCommand(
Oct 19 Javascript
js获取当前日期时间及其它日期操作汇总
Mar 08 Javascript
浅谈如何实现easyui的datebox格式化
Jun 12 Javascript
Angularjs 制作购物车功能实例代码
Sep 14 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
Oct 26 Javascript
three.js中文文档学习之通过模块导入
Nov 20 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
Feb 03 Javascript
Vue前后端不同端口的实现方法
Sep 19 Javascript
Vue项目history模式下微信分享爬坑总结
Mar 29 Javascript
JavaScript定时器设置、使用与倒计时案例详解
Jul 08 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
Nov 05 #Javascript
浅谈Vue数据响应
Nov 05 #Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
Nov 05 #Javascript
基于vue2的canvas时钟倒计时组件步骤解析
Nov 05 #Javascript
基于Vue2实现简易的省市区县三级联动组件效果
Nov 05 #Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
Nov 05 #Javascript
vue router的基本使用和配置教程
Nov 05 #Javascript
You might like
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
PHP中PDO的事务处理分析
2016/04/07 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
浅谈PHP进程管理
2019/03/08 PHP
checkbox勾选判断代码分析
2014/06/11 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
javascript版2048小游戏
2015/03/18 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
2015/10/14 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
JavaScript中各数制转换全面总结
2017/08/21 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
python机器学习之神经网络(二)
2017/12/20 Python
详解Python中的动态属性和特性
2018/04/07 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
详解Python 解压缩文件
2019/04/09 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
某某同志考察材料
2014/05/28 职场文书
党的群众路线教育实践活动总结
2014/10/30 职场文书
房产公证书样本
2015/01/23 职场文书
股东大会通知
2015/04/24 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
Python OpenCV 彩色与灰度图像的转换实现
2021/06/05 Python
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL