WEB小知识-HTTP请求对+和&的处理

1.问题

在HTTP请求中如果传的参数有一些特殊字符则会被编码成空格,导致服务端获取不到响应的信息.

对于+号会被编码为空格
对于&也会被编码成空格

举个例子,需要向服务端提交如下代码:

1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
cout << a+b << endl;
return 0;
}

编码后的内容如下,可以发现a+b被转换成了a b导致服务端接收到后编译失败.

1
2
3
4
5
#include%20%3Ciostream%3E%0A%0Ausing%20namespace%20std;
%0A%0Aint%20main()%0A%7B%0A%20%20%20%20int%20a,b;
%0A%20%20%20%20cin%20%3E%3E%20a%20%3E%3E%20b;
%0A%20%20%20%20cout%20%3C%3C%20a b%20%3C%3C%20endl;
%0A%20%20%20%20return%200;%0A%7D

2.解决方案

使用函数encodeURIComponent(),该函数会把特殊字符都给转义,转义结果如下面所示,可见a+b转换成了a%2Bb

1
2
3
4
5
%23include%20%3Ciostream%3E%0A%0Ausing%20namespace%20std%3B
%0A%0Aint%20main()%0A%7B%0A%20%20%20%20int%20a%2Cb%3B
%0A%20%20%20%20cin%20%3E%3E%20a%20%3E%3E%20b%3B
%0A%20%20%20%20cout%20%3C%3C%20a%2Bb%20%3C%3C%20endl%3B
%0A%20%20%20%20return%200%3B%0A%7D

服务端需要使用URLDecoder对其进行反转义,该问题到此解决.

感谢您的阅读,本文由 屈定's Blog 版权所有。如若转载,请注明出处:屈定's Blog(http://mrdear.cn/2017/05/22/web/WEB小知识-HTTP请求对+和&的处理/
Java8学习记录(二)-Stream原理
Spring Security学习记录(一) -- 初识Spring Security