我们实际使用二维码生成库时, 多数的二维码都是网址, 而且不会很短。发生标题所报的错误, 主要是因为扒的都是官网上的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 })) }