用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,登录网站

小程序社区 首页 教程 查看内容

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

Rolan 2018-11-6 00:32

HTTP + 加密 + 认证 + 完整性保护 = HTTPS,小程序考虑到信息安全的问题,选用了更为稳定安全的https 来进行信息传递。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种 ...

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

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

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

但是也有解决方案。

1.中继访问

 

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

拥有域名和云服务器

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

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

腾讯云上免费部署HTTPS

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

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

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

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

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

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

Java代码:

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

  1. package DataService;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStreamWriter;
  7. import java.io.PrintWriter;
  8. import java.net.HttpURLConnection;
  9. import java.net.URL;
  10. import java.net.URLConnection;
  11. import java.sql.ResultSet;
  12. import com.google.gson.Gson;
  13. /*
  14. * Author:陈浩东
  15. * QQ:1025584691
  16. */
  17. public class DouBanBook {
  18. //豆瓣接口实现
  19. public static String doPost(String url, String params, Integer connTimeout, Integer readTimeout, String contentType)
  20. {
  21. PrintWriter out = null;
  22. BufferedReader in = null;
  23. String result = "";
  24. try
  25. {
  26. URL realUrl = new URL(url);
  27. // 打开和URL之间的连接,根据url
  28. URLConnection conn = realUrl.openConnection();
  29. // 设置通用的请求属性
  30. conn.setRequestProperty("accept", "*/*");
  31. conn.setRequestProperty("connection", "Keep-Alive");
  32. conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  33. conn.setRequestProperty("Content-Type", contentType == null? "application/json" : contentType);
  34. // 发送POST请求必须设置如下两行
  35. conn.setDoOutput(true);
  36. conn.setDoInput(true);
  37. // 设置请求超时时间和读取超时时间
  38. conn.setConnectTimeout(connTimeout == null ? 180 : connTimeout);
  39. conn.setReadTimeout(readTimeout == null ? 180 : readTimeout);
  40. // 获取URLConnection对象对应的输出流,设置utf-8编码
  41. out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8"));
  42. // 发送请求参数
  43. out.print(params);
  44. // flush输出流的缓冲
  45. out.flush();
  46. // 定义BufferedReader输入流来读取URL的响应,设置utf-8编码
  47. in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
  48. String line;
  49. while ((line = in.readLine()) != null)
  50. result += line;
  51. }
  52. catch (Exception e)
  53. {
  54. e.printStackTrace();
  55. result = null;
  56. }
  57. //使用finally块来关闭输出流、输入流
  58. finally
  59. {
  60. try
  61. {
  62. if (out != null)
  63. {
  64. out.close();
  65. }
  66. if (in != null)
  67. {
  68. in.close();
  69. }
  70. }
  71. catch (IOException ex)
  72. {
  73. ex.printStackTrace();
  74. }
  75. }
  76. return result;
  77. }
  78. }

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

Servlet:

  1. package Servlet;
  2. import java.io.IOException;
  3. import java.io.Writer;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import com.google.gson.Gson;
  12. import DataService.DouBanBook;
  13. /**
  14. * Servlet implementation class doubanbook
  15. */
  16. @WebServlet("/doubanbook")
  17. public class doubanbook extends HttpServlet {
  18. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  19. request.setCharacterEncoding("utf-8");
  20. response.setContentType("text/html;charset=utf-8");
  21. response.setHeader("Access-Control-Allow-Origin", "*");
  22. response.setHeader("Access-Control-Allow-Methods", "GET,POST");
  23. String isbn = request.getParameter("isbn")==null?"no":request.getParameter("isbn");
  24. String sshpwd = request.getParameter("ssh_secret")==null?"no":request.getParameter("ssh_secret");
  25. System.out.println(sshpwd);
  26. System.out.println(isbn);
  27. Map<String, Object> result = new HashMap<String, Object>();
  28. String json = new Gson().toJson(result);
  29. Writer out = response.getWriter();
  30. out.write(DouBanBook.doPost("https://api.douban.com/v2/book/isbn/"+isbn, null, null, null, null));
  31. out.flush();
  32. }
  33. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  34. // TODO Auto-generated method stub
  35. doGet(request, response);
  36. }
  37. }

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

无域名和云服务器

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

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

参照写法一:

云函数调用方式访问API

  

 

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

鲜花
鲜花
鸡蛋
鸡蛋
分享至 : QQ空间
收藏
原作者: 小の白菜 来自: cnblogs