微信小程序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 相关文章推荐
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
Jun 14 Javascript
jquery 使用简明教程
Mar 05 Javascript
js获取当前日期前七天的方法
Feb 28 Javascript
浅谈js 闭包引起的内存泄露问题
Jun 22 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
Sep 08 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
Apr 07 Javascript
微信小程序滚动Tab实现左右可滑动切换
Aug 17 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
Apr 09 Javascript
前后端如何实现登录token拦截校验详解
Sep 03 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
Dec 28 Javascript
Vue使用axios出现options请求方法
May 30 Javascript
javascript单张多张图无缝滚动实例代码
May 10 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使用qr生成二维码的示例分享
2014/01/20 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
php递归函数怎么用才有效
2018/02/24 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
bootstrap fileinput完整实例分享
2016/11/08 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
python使用Apriori算法进行关联性解析
2017/12/21 Python
Python File readlines() 使用方法
2018/03/19 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
Python输出\u编码将其转换成中文的实例
2018/12/15 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
Interflora澳大利亚:同日鲜花速递
2019/06/25 全球购物
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
假日旅行社实习自我鉴定
2013/09/24 职场文书
申报职称专业技术个人的自我评价
2013/12/12 职场文书
村官学习十八大感想
2014/01/15 职场文书
国家税务局领导班子对照检查材料思想汇报
2014/10/04 职场文书
岳庙导游词
2015/02/04 职场文书