微信小程序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 相关文章推荐
浅谈JavaScript中指针和地址
Jul 26 Javascript
去除html代码里面的script正则方法
May 19 Javascript
JavaScript中的Array 对象(数组对象)
Jun 02 Javascript
Bootstrap3 多选和单选框(checkbox)
Dec 29 Javascript
js实现图片放大展示效果
Aug 30 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
Sep 18 Javascript
js实现通过开始结束控制的计时器
Feb 25 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
Mar 21 Javascript
对layui数据表格动态cols(字段)动态变化详解
Oct 25 Javascript
vue点击标签切换选中及互相排斥操作
Jul 17 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
Jul 20 Javascript
vue v-on:click传递动态参数的步骤
Sep 11 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
解析PHP高效率写法(详解原因)
2013/06/20 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
2017/08/15 PHP
一个选择最快的服务器转向代码
2009/04/27 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
2019/08/02 jQuery
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
消防安全标语
2014/06/07 职场文书
绿色环保口号
2014/06/12 职场文书
品质口号大全
2014/06/17 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
长江三峡导游词
2015/01/31 职场文书
公司行政管理制度范本
2015/08/05 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
图文详解matlab原始处理图像几何变换
2021/07/09 Python
基于Redis的List实现特价商品列表功能
2021/08/30 Redis