微信小程序http連接訪問(wèn)解決方案的示例
HTTP + 加密 + 認(rèn)證 + 完整性保護(hù) = HTTPS,小程序考慮到信息安全的問(wèn)題,選用了更為穩(wěn)定安全的https 來(lái)進(jìn)行信息傳遞。
HTTPS協(xié)議的主要作用可以分為兩種:一種是建立一個(gè)信息安全通道,來(lái)保證數(shù)據(jù)傳輸?shù)陌踩涣硪环N就是確認(rèn)網(wǎng)站的真實(shí)性。
這就導(dǎo)致了許多好用的http API無(wú)法在小程序中被調(diào)用。
但是也有解決方案。
1.中繼訪問(wèn)

中繼訪問(wèn)有兩種方式,一種需要自己擁有一個(gè)云服務(wù)和域名。
擁有域名和云服務(wù)器
域名完成備案之后下載證書(shū)
https指引教程如下------>
再講域名解析到你的云服務(wù)器的IP。
這樣子你的域名就是https的了,小程序可以訪問(wèn)你的服務(wù)器了,現(xiàn)在就開(kāi)始在云服務(wù)上實(shí)現(xiàn)訪問(wèn)http API 服務(wù)
實(shí)際上只需要面向小程序和API Server 做一個(gè)雙面響應(yīng)即可。

實(shí)現(xiàn)這種功能,顯而易見(jiàn),在服務(wù)器上部署一個(gè)Web項(xiàng)目是最簡(jiǎn)單的實(shí)現(xiàn)方式:
我們以訪問(wèn)豆瓣圖書(shū)API 為例:https://api.douban.com/v2/book/isbn/
豆瓣API雖然是https的,但是來(lái)自小程序的訪問(wèn)是被禁止的。下面代碼同樣適用于http 連接
Java代碼:
這個(gè)是 通用代碼 ,無(wú)論是訪問(wèn)什么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 {
//豆瓣接口實(shí)現(xiàn)
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);
// 打開(kāi)和URL之間的連接,根據(jù)url
URLConnection conn = realUrl.openConnection();
// 設(shè)置通用的請(qǐng)求屬性
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);
// 發(fā)送POST請(qǐng)求必須設(shè)置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
// 設(shè)置請(qǐng)求超時(shí)時(shí)間和讀取超時(shí)時(shí)間
conn.setConnectTimeout(connTimeout == null ? 180 : connTimeout);
conn.setReadTimeout(readTimeout == null ? 180 : readTimeout);
// 獲取URLConnection對(duì)象對(duì)應(yīng)的輸出流,設(shè)置utf-8編碼
out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8"));
// 發(fā)送請(qǐng)求參數(shù)
out.print(params);
// flush輸出流的緩沖
out.flush();
// 定義BufferedReader輸入流來(lái)讀取URL的響應(yīng),設(shè)置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塊來(lái)關(guān)閉輸出流、輸入流
finally
{
try
{
if (out != null)
{
out.close();
}
if (in != null)
{
in.close();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
return result;
}
}
根據(jù)訪問(wèn)不同的API,只需要修改Servlet的寫(xiě)法就可以:
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等語(yǔ)言來(lái)實(shí)現(xiàn)中繼訪問(wèn)這個(gè)功能。
無(wú)域名和云服務(wù)器
對(duì)于個(gè)人開(kāi)發(fā)者來(lái)說(shuō),尤其是學(xué)生來(lái)說(shuō),又是是沒(méi)有條件購(gòu)買長(zhǎng)時(shí)間的云服務(wù)器的,這個(gè)時(shí)候我們?nèi)绻情_(kāi)發(fā)小程序的話,可以用他們提供的空間。
使用微信小程序的云開(kāi)發(fā)能力,Node.js 函數(shù),用js 實(shí)現(xiàn)服務(wù)端的響應(yīng),訪問(wèn)非https API。
參照寫(xiě)法一:
云函數(shù)調(diào)用方式訪問(wèn)API
const cloud = require('wx-server-sdk')
cloud.init()
// 云函數(shù)入口函數(shù)
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}`);
});
})
}
不知道什么原因,云函數(shù)我感覺(jué)并不是很穩(wěn)定,建議有條件的還是用自己的服務(wù)器來(lái)實(shí)現(xiàn)吧。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript高級(jí)程序設(shè)計(jì) 錯(cuò)誤處理與調(diào)試學(xué)習(xí)筆記
JavaScript高級(jí)程序設(shè)計(jì) 錯(cuò)誤處理與調(diào)試學(xué)習(xí)筆記,學(xué)習(xí)js的朋友可以參考下。2011-09-09
JavaScript中數(shù)組遍歷的7種方法小結(jié)
作為JavaScript開(kāi)發(fā)人員,熟悉數(shù)組的遍歷和操作是非常重要的,數(shù)組遍歷是處理和操作數(shù)組元素的基本需求之一,本文將介紹JavaScript中的7種常見(jiàn)數(shù)組遍歷方法,幫助你成為數(shù)組操作的達(dá)人2023-11-11
學(xué)習(xí)JavaScript設(shè)計(jì)模式(接口)
這篇文章主要帶領(lǐng)大家學(xué)習(xí)JavaScript設(shè)計(jì)模式,其中重點(diǎn)介紹接口,舉例說(shuō)明什么是接口,對(duì)接口進(jìn)行詳細(xì)剖析,感興趣的小伙伴們可以參考一下2015-11-11
JS實(shí)現(xiàn)萬(wàn)億數(shù)字轉(zhuǎn)中文的代碼詳解
在軟件開(kāi)發(fā)中,尤其是在中文處理的場(chǎng)景中,數(shù)字與語(yǔ)言的轉(zhuǎn)換是一個(gè)常見(jiàn)且具有挑戰(zhàn)性的任務(wù),在一些業(yè)務(wù)系統(tǒng)中,可能需要將阿拉伯?dāng)?shù)字轉(zhuǎn)換為中文數(shù)字,本文將介紹如何使用 JavaScript 將數(shù)字轉(zhuǎn)換成中文,幫助開(kāi)發(fā)者為相關(guān)的需求提供實(shí)現(xiàn)思路,需要的朋友可以參考下2024-12-12
實(shí)現(xiàn)png圖片和png背景透明(支持多瀏覽器)的方法
Firefox和Opera對(duì)PNG的支持非常的好,都是IE卻無(wú)視PNG圖片這一特性的“存在”,雖然IE7已經(jīng)支持都是IE6還是不行。2009-09-09
JSON數(shù)據(jù)中存在單個(gè)轉(zhuǎn)義字符“\”的處理方法
這篇文章主要介紹了JSON數(shù)據(jù)中存在單個(gè)轉(zhuǎn)義字符“\”的處理方法,在這里反斜杠(又稱右斜杠"\"),還表示轉(zhuǎn)義字符,字符串中不能成單出現(xiàn)。具體內(nèi)容詳情大家跟隨腳本之家小編一起看看吧2018-07-07
xmlplus組件設(shè)計(jì)系列之下拉刷新(PullRefresh)(6)
xmlplus 是一個(gè)JavaScript框架,用于快速開(kāi)發(fā)前后端項(xiàng)目。這篇文章主要介紹了xmlplus組件設(shè)計(jì)系列之下拉刷新,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
javascript實(shí)現(xiàn)的淘寶旅行通用日歷組件用法實(shí)例
這篇文章主要介紹了javascript實(shí)現(xiàn)的淘寶旅行通用日歷組件,以實(shí)例形式分析了該日歷組件的相關(guān)設(shè)置及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
詳解利用exif.js解決ios手機(jī)上傳豎拍照片旋轉(zhuǎn)90度問(wèn)題
這篇文章主要介紹了詳解利用exif.js解決ios手機(jī)上傳豎拍照片旋轉(zhuǎn)90度問(wèn)題,有需要的朋友可以了解一下。2016-11-11

