在使用代码组装URL时,一定要注意URL中的特殊字符。某些特殊字符的存在,在传输之后会切断你的URL,导致你的访问链接变得不正确。
例如下面这个,我组装之后的链接形式:
最后的time字段是有个空格的。用这个链接去请求服务,一直返回错误。很苦恼。
后来,我用浏览器打开这个链接,可以获取到正确的数据。通过比较代码中的URL字符串和浏览器中的地址:
发现,字符串URL中的空格被自动替换成了%20
。我也将代码中的URL中的空格替换成%20
之后,代码也执行成功了。
所以,在代码中组装URL时,一定要注意里面的特殊字符。
我写了下面这个替换特殊字符的函数,可以直接用,防止URL中的特殊字符对代码造成大坑。
VVoid UrlEncode(const std::string& url, std::string& strTmpUrlPar) { strTmpUrlPar= url; strTmpUrlPar.replace(",", "%2C"); strTmpUrlPar.replace("\\", "%5C"); strTmpUrlPar.replace("\"", "%22"); strTmpUrlPar.replace(":", "%3A"); strTmpUrlPar.replace("{", "%7B"); strTmpUrlPar.replace("}", "%7D"); strTmpUrlPar.replace("[", "%5B"); strTmpUrlPar.replace("]", "%5D"); strTmpUrlPar.replace("|", "%7C"); strTmpUrlPar.replace(" ", "%20"); strTmpUrlPar.replace("+", "%20"); strTmpUrlPar.replace(";", "%3B"); strTmpUrlPar.replace("!", "%21"); strTmpUrlPar.replace("#", "%23"); strTmpUrlPar.replace("$", "%24"); strTmpUrlPar.replace("'", "%27"); strTmpUrlPar.replace("(", "%28"); strTmpUrlPar.replace(")", "%29"); strTmpUrlPar.replace("*", "%2A"); strTmpUrlPar.replace("/", "%2F"); strTmpUrlPar.replace("?", "%3F"); strTmpUrlPar.replace("@", "%40"); }