本次主要分享的是3個免費的二維碼接口的對接代碼和測試得出的注意點及區別,有更好處理方式多多交流,相互促進進步;最近在學習JavsScript的擴展TypeScript,感受語法糖很甜,大部分與C#更爲相似,可能都是微軟項目的緣由吧,有興趣的朋友能夠多多相互交流下;php
以上是我的的見解,下面來正式分享今天的文章吧:api
. Google的Api二維碼生成接口瀏覽器
. 2d-code的Api二維碼生成接口緩存
. topscan的Api二維碼生成接口ide
. 使用面向對象+加載程序集建立對象合併以上接口封裝成二維碼生成工廠學習
下面一步一個腳印的來分享:測試
. Google的Api二維碼生成接口google
首先,這裏給出Google接口文檔的連接qr_codes文檔,熱情的朋友立刻就會打開此連接吧,詳細看下里面的參數這就不作截圖了,大體一般用到的參數是:api地址,內容參數,生成圖片的高寬這3個參數,其餘的幾個參數都採用默認的吧,不一樣須要你們能夠更詳細的看下;其實第一次看到文檔裏面的參數,感受少了一些東西,好比怎麼不能傳遞二維碼中間那個圖標的圖片地址和掃描二維碼事後怎麼跳轉到我想重定向的url連接呢,帶着這個疑問我進行了屢次的嘗試;下面給出本身嘗試的結果說明:url
1. 接口關鍵參數是:cht(固定值qr),chl(內容參數),chs(生成出來二維碼圖片尺寸,格式如:200x200,這裏是xyz的x不是*)spa
2. api接口只會生成一個二維碼的圖片流,若是須要把圖片保存到本地須要經過瀏覽器直接get訪問接口或者經過程序下載這個二維碼
3. 內容參數若是傳遞文本信息,在生成出來的二維碼圖片中間不會顯示文本內容,只有用手機掃描二維碼才能在手機上顯示傳遞的文本信息
4. 內容參數若是傳遞單純的http://格式的連接地址,那麼手機掃描後會自動重定向到改http://連接地址上(這個掃描重定向能夠用來作一些商品或者文章的查看)
5. google接口暫未研究出此Logo圖標地址參數(但願有朋友研究出來後與我分享,謝謝)
6. 因爲api地址是國外的,調用接口響應不是那麼快速
其次,上面是我的的一些總結,下面咱們來看下封裝的請求接口方法和下載二維碼圖片方法:
1 #region 生成二維碼 2 3 /// <summary> 4 /// 生成二維碼 5 /// </summary> 6 /// <param name="content">展現內容(文本內容 或者 掃描後的跳轉http://格式的地址)</param> 7 /// <param name="savePath">保存二維碼的磁盤路徑(默認程序跟目錄+QRCode)</param> 8 /// <param name="logoUrl"> Logo圖標地址(格式:http://),(注:google接口暫未研究出此參數)</param> 9 /// <param name="apiUrl">接口地址(內置默認api地址)</param> 10 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默認200)</param> 11 /// <returns></returns> 12 public virtual string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null) 13 { 14 var qrName = string.Empty; 15 16 #region 參數初始化 17 18 ApiUrl = apiUrl ?? ApiUrl; 19 Content = content ?? Content; 20 SaveQRPath = savePath ?? SaveQRPath; 21 LogoUrl = logoUrl ?? LogoUrl; 22 WAndH = wAndh ?? WAndH; 23 #endregion 24 25 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; } 26 27 ApiUrl = string.Format("{0}?cht=qr&chl={1}&chs={2}x{2}", 28 ApiUrl, 29 HttpUtility.UrlEncode(Content), 30 WAndH); 31 32 qrName = DownImg(ApiUrl, SaveQRPath, ImageFormat.Jpeg); 33 return qrName; 34 } 35 #endregion
下載二維碼圖片保存到程序根目錄:
1 #region 下載圖片 2 3 /// <summary> 4 /// 下載圖片 5 /// </summary> 6 /// <param name="url">圖片下載地址</param> 7 /// <param name="savePath">保存路徑默認:Img文件夾</param> 8 /// <param name="format">默認:Jpeg</param> 9 /// <returns>新圖片名稱</returns> 10 public virtual string DownImg(string url, string savePath = "QRCode", ImageFormat format = null) 11 { 12 var qrName = string.Empty; 13 try 14 { 15 format = format ?? ImageFormat.Jpeg; 16 17 HttpClient http = new HttpClient(); 18 http.Timeout = new TimeSpan(0, 1, 0); 19 using (var stream = http.GetStreamAsync(url).Result) 20 { 21 22 if (!Directory.Exists(SaveQRPath)) { Directory.CreateDirectory(SaveQRPath); } 23 qrName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + format; 24 var path = Path.Combine(savePath, qrName); 25 using (Image img = Image.FromStream(stream)) 26 { 27 img.Save(path, format); 28 } 29 } 30 } 31 catch (Exception ex) 32 { 33 qrName = string.Empty; 34 } 35 return qrName; 36 } 37 #endregion
上面兩個方法使用的是虛方法,由於我這裏是吧google接口當作默認的二維碼生成器來使用,後面要講的另外兩個接口都是重寫與此;下載圖片的方法都是公用的,暫不須要重寫;這裏須要提到的是調用api接口時有一個固定的參數cht=qr,這個參數表示採用QR方法生成二維碼,由於這個api接口還有生成圖標的功能,因此只想要生成二維碼這裏就固定,更多的生成圖標功能不在本章分享中,謝謝。
. 2d-code的Api二維碼生成接口
首先,該接口須要經過他們官網註冊一個key,而後從後臺獲取到這個key後才能調用接口地址,固然註冊後有個功能是,凡是您經過api接口生成的二維碼,除了本身經過流下載,還能經過他們後臺一塊兒下載全部生成的圖片,本人暫時沒有去關注是否生成量大了會收費哈哈,下面列舉下接口參數說明和測試得出的注意點:
1. 接口關鍵參數是:key(註冊獲取),text(文本參數),url(掃描後重定向地址),logo(Logo圖標地址),size(二維碼正方形,高寬)
2. 接口的文本參數只能傳遞文本,不能當作掃描後重定向的地址參數使用和Google等接口有點不同
3. 掃描後重定向地址和Logo圖標地址都是可訪問的http://格式的地址連接
4. Logo圖標地址,官方說不建議使用png格式,測試只有jpg成功(多是測試不夠多這裏只單純介紹個人結果)
5. 生成速度比較快,並且還有一個藝術字的生成接口,挺不錯
6. api接口只會生成一個二維碼的圖片流,若是須要把圖片保存到本地須要經過瀏覽器直接get訪問接口或者經過程序下載這個二維碼
其次,下面給出封裝的代碼,因爲下載和上面介紹的代碼同樣是公用的這裏就不作陳述:
1 public QR_2dCode() 2 { 3 4 ApiUrl = "http://www.2d-code.cn/2dcode/api.php"; 5 } 6 7 #region 生成二維碼 8 9 /// <summary> 10 /// 生成二維碼 11 /// </summary> 12 /// <param name="content">展現內容(文本內容 或者 掃描後的跳轉http://格式的地址)</param> 13 /// <param name="savePath">保存二維碼的磁盤路徑(默認程序跟目錄+QRCode)</param> 14 /// <param name="logoUrl"> Logo圖標地址(格式:http://),官方不建議使用png格式,測試只有jpg成功</param> 15 /// <param name="directUrl">掃描後重定向地址(http://)</param> 16 /// <param name="apiUrl">接口地址(內置默認api地址)</param> 17 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默認200)</param> 18 /// <returns></returns> 19 public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null) 20 { 21 var qrName = string.Empty; 22 23 #region 參數初始化 24 25 ApiUrl = apiUrl ?? ApiUrl; 26 Content = content ?? Content; 27 SaveQRPath = savePath ?? SaveQRPath; 28 LogoUrl = logoUrl ?? LogoUrl; 29 WAndH = wAndh ?? WAndH; 30 #endregion 31 32 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; } 33 34 ApiUrl = string.Format("{0}?key=c_d800OBbu6hDzJtXPE2Yd02IMtmpuK9VdCqHe6vrtar4&text={1}&url={2}&logo={3}&size={4}", 35 ApiUrl, 36 HttpUtility.UrlEncode(Content.Contains("http") ? "" : Content), 37 HttpUtility.UrlEncode(Content), 38 HttpUtility.UrlEncode(LogoUrl), 39 WAndH); 40 41 qrName = DownImg(ApiUrl, SaveQRPath); 42 return qrName; 43 } 44 #endregion
. topscan的Api二維碼生成接口
首先,該接口確定是免費的,參數描述和google的差很少,不一樣處在於能夠傳遞Logo圖標地址(固然可能我還沒發現google的能夠傳遞logo的參數,故此朋友們能夠忽略);下面列舉下接口參數說明和測試得出的注意點:
1. 接口關鍵參數是:text(內容參數),logo(Logo圖標地址),w(生成出來二維碼圖片尺寸,格式如:200x200,這裏是xyz的x不是*)
2. api接口只會生成一個二維碼的圖片流,若是須要把圖片保存到本地須要經過瀏覽器直接get訪問接口或者經過程序下載這個二維碼
3. 內容參數若是傳遞文本信息,在生成出來的二維碼圖片中間不會顯示文本內容,只有用手機掃描二維碼才能在手機上顯示傳遞的文本信息
4. 內容參數若是傳遞單純的http://格式的連接地址,那麼手機掃描後會自動重定向到改http://連接地址上(這個掃描重定向能夠用來作一些商品或者文章的查看)
5. Logo圖標地址(格式:http://),jpg,png測試經過
6. 測試得出有時候請求生成二維碼不返回數據,有多是我網路問題吧,正常生成二維碼的速度仍是挺快
其次,下面給出封裝的代碼,因爲下載和上面介紹的代碼同樣是公用的這裏就不作陳述:
1 public QR_TopScan() 2 { 3 4 ApiUrl = "http://qr.topscan.com/api.php"; 5 } 6 7 #region 生成二維碼 8 9 /// <summary> 10 /// 生成二維碼 11 /// </summary> 12 /// <param name="content">展現內容(文本內容 或者 掃描後的跳轉http://格式的地址)</param> 13 /// <param name="savePath">保存二維碼的磁盤路徑(默認程序跟目錄+QRCode)</param> 14 /// <param name="logoUrl"> Logo圖標地址(格式:http://),jpg,png測試經過,測試得出有不能成功的,緣由不知是否和地址有關</param> 15 /// <param name="apiUrl">接口地址(內置默認api地址)</param> 16 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默認200)</param> 17 /// <returns></returns> 18 public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null) 19 { 20 var qrName = string.Empty; 21 22 #region 參數初始化 23 24 ApiUrl = apiUrl ?? ApiUrl; 25 Content = content ?? Content; 26 SaveQRPath = savePath ?? SaveQRPath; 27 LogoUrl = logoUrl ?? LogoUrl; 28 WAndH = wAndh ?? WAndH; 29 #endregion 30 31 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; } 32 33 ApiUrl = string.Format("{0}?text={1}&logo={2}&w={3}", 34 ApiUrl, 35 HttpUtility.UrlEncode(Content), 36 HttpUtility.UrlEncode(LogoUrl), 37 WAndH); 38 39 qrName = DownImg(ApiUrl, SaveQRPath); 40 return qrName; 41 } 42 #endregion
. 使用面向對象+加載程序集建立對象合併以上接口封裝成二維碼生成工廠
首先,分析上面3個接口的參數能夠看出,都須要固定的參數:接口api,內容(文本或跳轉http地址),Logo圖片地址(google暫時除外),寬度和高度等這幾個參數,這樣一來咋們能夠定義個統一參數類,來傳遞該參數信息,這裏還要提下因爲這幾個接口都是從別人接口獲取圖片流,若是想要吧圖片在執行程序時候直接保存在咱們的程序本地,都須要下載,因此又多一個參數: 保存二維碼的磁盤路徑,因此纔有了一下公共的屬性:
1 #region 基礎配置信息 2 3 /// <summary> 4 /// 接口地址(必填) 5 /// </summary> 6 protected string ApiUrl = "https://chart.googleapis.com/chart"; 7 8 /// <summary> 9 /// 展現內容(文本內容),google文本參數直接傳遞http地址直接重定向 10 /// </summary> 11 protected string Content = "http://www.cnblogs.com/wangrudong003/"; 12 13 /// <summary> 14 /// 保存二維碼的磁盤路徑(默認程序跟目錄+QRCode) 15 /// </summary> 16 protected string SaveQRPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "QRCode"); 17 18 /// <summary> 19 /// Logo圖片地址(http://) 20 /// </summary> 21 protected string LogoUrl = "http://a.hiphotos.baidu.com/baike/w%3D268%3Bg%3D0/sign=9a34e44d8bd4b31cf03c93bdbfed4042/2cf5e0fe9925bc318cb9fe965edf8db1ca1370dc.jpg"; 22 23 /// <summary> 24 /// 寬度和高度(二維碼正方形的,高寬一至,默認200) 25 /// </summary> 26 protected int WAndH = 200; 27 28 #endregion
而後,這裏我不想每一個接口都手動new一次來建立對象,因此用了加載程序集的模塊的方式來建立所須要的對象,所以有了工廠類的入口:
1 /// <summary> 2 /// 二維碼生成工廠 3 /// </summary> 4 public class QRCodeReposity 5 { 6 7 public static BaseQRCode Current(QREmType qrEmType = QREmType.BaseQRCode) 8 { 9 10 var nspace = typeof(BaseQRCode); 11 var fullName = nspace.FullName; 12 var nowspace = fullName.Substring(0, fullName.LastIndexOf('.') + 1); 13 14 return Assembly.GetExecutingAssembly().CreateInstance(nowspace + qrEmType.ToString(), true) as BaseQRCode; 15 } 16 }
這裏和以前的緩存工廠文章設計差很少,能夠查閱下以前的分享篇,也多多點贊,謝謝;下面在給出說有的代碼以下:
1 /// <summary> 2 /// 工廠模塊定義 3 /// </summary> 4 public enum QREmType 5 { 6 /// <summary> 7 /// google接口 8 /// </summary> 9 BaseQRCode, 10 11 /// <summary> 12 /// 2d-code接口 13 /// </summary> 14 QR_2dCode, 15 16 /// <summary> 17 /// topscan接口 18 /// </summary> 19 QR_TopScan 20 } 21 22 /// <summary> 23 /// 二維碼生成工廠 24 /// </summary> 25 public class QRCodeReposity 26 { 27 28 public static BaseQRCode Current(QREmType qrEmType = QREmType.BaseQRCode) 29 { 30 31 var nspace = typeof(BaseQRCode); 32 var fullName = nspace.FullName; 33 var nowspace = fullName.Substring(0, fullName.LastIndexOf('.') + 1); 34 35 return Assembly.GetExecutingAssembly().CreateInstance(nowspace + qrEmType.ToString(), true) as BaseQRCode; 36 } 37 } 38 39 /// <summary> 40 /// 基類使用Google提供Api:https://developers.google.com/chart/infographics/docs/qr_codes ,因爲是國外地址,相對來講有點慢 41 /// </summary> 42 public class BaseQRCode 43 { 44 45 #region 基礎配置信息 46 47 /// <summary> 48 /// 接口地址(必填) 49 /// </summary> 50 protected string ApiUrl = "https://chart.googleapis.com/chart"; 51 52 /// <summary> 53 /// 展現內容(文本內容),google文本參數直接傳遞http地址直接重定向 54 /// </summary> 55 protected string Content = "http://www.cnblogs.com/wangrudong003/"; 56 57 /// <summary> 58 /// 保存二維碼的磁盤路徑(默認程序跟目錄+QRCode) 59 /// </summary> 60 protected string SaveQRPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "QRCode"); 61 62 /// <summary> 63 /// Logo圖片地址(http://) 64 /// </summary> 65 protected string LogoUrl = "http://a.hiphotos.baidu.com/baike/w%3D268%3Bg%3D0/sign=9a34e44d8bd4b31cf03c93bdbfed4042/2cf5e0fe9925bc318cb9fe965edf8db1ca1370dc.jpg"; 66 67 /// <summary> 68 /// 寬度和高度(二維碼正方形的,高寬一至,默認200) 69 /// </summary> 70 protected int WAndH = 200; 71 72 #endregion 73 74 #region 方法 75 76 #region 生成二維碼 77 78 /// <summary> 79 /// 生成二維碼 80 /// </summary> 81 /// <param name="content">展現內容(文本內容 或者 掃描後的跳轉http://格式的地址)</param> 82 /// <param name="savePath">保存二維碼的磁盤路徑(默認程序跟目錄+QRCode)</param> 83 /// <param name="logoUrl"> Logo圖標地址(格式:http://),(注:google接口暫未研究出此參數)</param> 84 /// <param name="apiUrl">接口地址(內置默認api地址)</param> 85 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默認200)</param> 86 /// <returns></returns> 87 public virtual string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null) 88 { 89 var qrName = string.Empty; 90 91 #region 參數初始化 92 93 ApiUrl = apiUrl ?? ApiUrl; 94 Content = content ?? Content; 95 SaveQRPath = savePath ?? SaveQRPath; 96 LogoUrl = logoUrl ?? LogoUrl; 97 WAndH = wAndh ?? WAndH; 98 #endregion 99 100 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; } 101 102 ApiUrl = string.Format("{0}?cht=qr&chl={1}&chs={2}x{2}", 103 ApiUrl, 104 HttpUtility.UrlEncode(Content), 105 WAndH); 106 107 qrName = DownImg(ApiUrl, SaveQRPath, ImageFormat.Jpeg); 108 return qrName; 109 } 110 #endregion 111 112 #region 下載圖片 113 114 /// <summary> 115 /// 下載圖片 116 /// </summary> 117 /// <param name="url">圖片下載地址</param> 118 /// <param name="savePath">保存路徑默認:Img文件夾</param> 119 /// <param name="format">默認:Jpeg</param> 120 /// <returns>新圖片名稱</returns> 121 public virtual string DownImg(string url, string savePath = "QRCode", ImageFormat format = null) 122 { 123 var qrName = string.Empty; 124 try 125 { 126 format = format ?? ImageFormat.Jpeg; 127 128 HttpClient http = new HttpClient(); 129 http.Timeout = new TimeSpan(0, 1, 0); 130 using (var stream = http.GetStreamAsync(url).Result) 131 { 132 133 if (!Directory.Exists(SaveQRPath)) { Directory.CreateDirectory(SaveQRPath); } 134 qrName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + format; 135 var path = Path.Combine(savePath, qrName); 136 using (Image img = Image.FromStream(stream)) 137 { 138 img.Save(path, format); 139 } 140 } 141 } 142 catch (Exception ex) 143 { 144 qrName = string.Empty; 145 } 146 return qrName; 147 } 148 #endregion 149 150 #endregion 151 } 152 153 /// <summary> 154 /// 使用2d-code提供Api,須要去官網註冊獲取Key 155 /// </summary> 156 public class QR_2dCode : BaseQRCode 157 { 158 159 public QR_2dCode() 160 { 161 162 ApiUrl = "http://www.2d-code.cn/2dcode/api.php"; 163 } 164 165 #region 生成二維碼 166 167 /// <summary> 168 /// 生成二維碼 169 /// </summary> 170 /// <param name="content">展現內容(文本內容 或者 掃描後的跳轉http://格式的地址)</param> 171 /// <param name="savePath">保存二維碼的磁盤路徑(默認程序跟目錄+QRCode)</param> 172 /// <param name="logoUrl"> Logo圖標地址(格式:http://),官方不建議使用png格式,測試只有jpg成功</param> 173 /// <param name="directUrl">掃描後重定向地址(http://)</param> 174 /// <param name="apiUrl">接口地址(內置默認api地址)</param> 175 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默認200)</param> 176 /// <returns></returns> 177 public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null) 178 { 179 var qrName = string.Empty; 180 181 #region 參數初始化 182 183 ApiUrl = apiUrl ?? ApiUrl; 184 Content = content ?? Content; 185 SaveQRPath = savePath ?? SaveQRPath; 186 LogoUrl = logoUrl ?? LogoUrl; 187 WAndH = wAndh ?? WAndH; 188 #endregion 189 190 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; } 191 192 ApiUrl = string.Format("{0}?key=c_d800OBbu6hDzJtXPE2Yd02IMtmpuK9VdCqHe6vrtar4&text={1}&url={2}&logo={3}&size={4}", 193 ApiUrl, 194 HttpUtility.UrlEncode(Content.Contains("http") ? "" : Content), 195 HttpUtility.UrlEncode(Content), 196 HttpUtility.UrlEncode(LogoUrl), 197 WAndH); 198 199 qrName = DownImg(ApiUrl, SaveQRPath); 200 return qrName; 201 } 202 #endregion 203 } 204 205 /// <summary> 206 /// 使用topscan提供Api 207 /// </summary> 208 public class QR_TopScan : BaseQRCode 209 { 210 211 public QR_TopScan() 212 { 213 214 ApiUrl = "http://qr.topscan.com/api.php"; 215 } 216 217 #region 生成二維碼 218 219 /// <summary> 220 /// 生成二維碼 221 /// </summary> 222 /// <param name="content">展現內容(文本內容 或者 掃描後的跳轉http://格式的地址)</param> 223 /// <param name="savePath">保存二維碼的磁盤路徑(默認程序跟目錄+QRCode)</param> 224 /// <param name="logoUrl"> Logo圖標地址(格式:http://),jpg,png測試經過,測試得出有不能成功的,緣由不知是否和地址有關</param> 225 /// <param name="apiUrl">接口地址(內置默認api地址)</param> 226 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默認200)</param> 227 /// <returns></returns> 228 public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null) 229 { 230 var qrName = string.Empty; 231 232 #region 參數初始化 233 234 ApiUrl = apiUrl ?? ApiUrl; 235 Content = content ?? Content; 236 SaveQRPath = savePath ?? SaveQRPath; 237 LogoUrl = logoUrl ?? LogoUrl; 238 WAndH = wAndh ?? WAndH; 239 #endregion 240 241 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; } 242 243 ApiUrl = string.Format("{0}?text={1}&logo={2}&w={3}", 244 ApiUrl, 245 HttpUtility.UrlEncode(Content), 246 HttpUtility.UrlEncode(LogoUrl), 247 WAndH); 248 249 qrName = DownImg(ApiUrl, SaveQRPath); 250 return qrName; 251 } 252 #endregion 253 }
本篇的分享內容在程序設計方面沒有太多,重點是分裝下這幾個接口和分享下接口的差別,方面朋友們能夠拿來主義和正在對接二維碼生成的朋友作下交流,僅此而已;關鍵代碼的備註都在分享代碼裏,有更好或者不清楚的地方歡迎留言,謝謝,放一張效果圖,你們能夠掃一掃: