cpprest传递日文字符触发URI无效错误的原因排查
问题原因与解决方案
这个问题的核心原因很明确:你没有对URL路径中的非ASCII日文字符进行URL编码。
HTTP协议的URI规范明确要求,除了一小部分ASCII字符(比如字母、数字、-._~这些)之外,所有其他字符都需要编码成%XX的十六进制格式。你用conversions::to_utf8string把日文转成了UTF-8字符串,但这只是完成了字符编码的转换,并没有把这些多字节的UTF-8字符转换成符合URI要求的编码形式。直接把未编码的日文放到URL路径里,会被解析成乱码(就是你看到的?? ??),服务器自然会判定这是一个无效的URI。
解决方法
cpprest(Casablanca)库已经提供了专门的URL编码函数web::uri::encode_uri_component,你只需要在把搜索文本传入请求前,用这个函数对其进行编码即可:
auto nullValue = json::value::null(); std::string searchText = conversions::to_utf8string("北島 美奈"); // 对搜索文本执行URL编码,符合URI规范 std::string encodedSearchText = web::uri::encode_uri_component(searchText); make_request(client, methods::GET, nullValue, encodedSearchText);
这个函数会把“北島 美奈”转换成符合URI要求的%E5%8C%97%E5%B3%B6%20%E7%BE%8E%E5%A5%88格式,服务器收到后就能正确解码并识别出搜索关键词,返回你预期的JSON结果。
额外提醒
不光是日文、中文这类非ASCII字符,只要你的路径/查询参数里包含空格、&、=、/这类特殊符号,都需要执行URL编码,否则都会出现类似的URI无效或者参数解析错误的问题。
内容的提问来源于stack exchange,提问作者noyruto88
相关产品推荐
相关产品推荐

