微信小程序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与其它js(Prototype)库兼容共存
Jul 04 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
Aug 30 Javascript
JavaScript对象学习经验整理
Oct 12 Javascript
node.js中的fs.openSync方法使用说明
Dec 17 Javascript
jQuery Easyui实现左右布局
Jan 26 Javascript
原生JS实现图片轮播与淡入效果的简单实例
Aug 21 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
Aug 31 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
Dec 21 Javascript
vue2.0 自定义日期时间过滤器
Jun 07 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
Mar 21 Javascript
使用layer弹窗,制作编辑User信息页面的方法
Sep 27 Javascript
微信小程序全选多选效果实现代码解析
Jan 21 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
图解上海144收音机
2021/03/02 无线电
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
javascript div 遮罩层封锁整个页面
2009/07/10 Javascript
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
基于JQUERY的两个ListBox子项互相调整的实现代码
2011/05/07 Javascript
jquery异步请求实例代码
2011/06/21 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
2016/08/02 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
基于Vue2.0的分页组件
2017/03/16 Javascript
Vue实现一种简单的无限循环滚动动画的示例
2021/01/10 Vue.js
Python学习教程之常用的内置函数大全
2017/07/14 Python
Python中协程用法代码详解
2018/02/10 Python
Python读写zip压缩文件的方法
2018/08/29 Python
Python的UTC时间转换讲解
2019/02/26 Python
python两个_多个字典合并相加的实例代码
2019/12/26 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
python打包多类型文件的操作方法
2020/09/21 Python
HTML5实现无刷新修改URL的方法
2019/11/14 HTML / CSS
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
宿舍使用违章电器检讨书
2014/01/12 职场文书
ktv中秋节活动方案
2014/01/30 职场文书
秸秆管理实施方案
2014/03/15 职场文书
课外活动总结范文
2014/07/09 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
工作自我推荐信范文
2015/03/25 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
如何使用Python实现一个简易的ORM模型
2021/05/12 Python
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
Java版 单机五子棋
2022/05/04 Java/Android