我們實際使用二維碼生成庫時, 多數的二維碼都是網址, 而且不會很短。發生標題所報的錯誤, 主要是因爲扒的都是官網上的demo, 沒有看裡面限定了複雜度參數。
這裡我們拿一個用於web接口的rust代碼案例舉例:
use fast_qr::{QRBuilder, ECL, Version}; use serde_json::json; pub async fn some_func(url: String) { if url.len() > 255 { return Json(json!({ "code": 31, "msg": "非法參數" })); } let qrcode = QRBuilder::new(url) .ecl(ECL::H) .version(Version::V03) .build() .unwrap(); let _svg = SvgBuilder::default() .shape(Shape::RoundedSquare) .to_str(&qrcode); // let str: String = qrcode.to_str(); Json(json!({ "code": 1, "msg": _svg })) }
將這段類似的代碼開放出去的話, 雖然能跑通編譯過程, 但只要傳了url字符串超過一定的長度, 就會報錯
Specified version too low to contain data
這裡所說的Specified version (指定版本), 指的就是代碼當中的這一行:
.version(Version::V03)
實際場景中我們無需強行限制, 請去掉版本限制, 那麽健康的代碼如下:
use fast_qr::{QRBuilder, ECL}; use serde_json::json; pub async fn some_func(url: String) { if url.len() > 255 { return Json(json!({ "code": 31, "msg": "非法參數" })); } let qrcode = QRBuilder::new(url) .ecl(ECL::H) // .version(Version::V03) # 注釋掉 .build() .unwrap(); let _svg = SvgBuilder::default() .shape(Shape::RoundedSquare) .to_str(&qrcode); // let str: String = qrcode.to_str(); Json(json!({ "code": 1, "msg": _svg })) }