http请求url参数包含+号,被解析为空格

// 接口URL+模板调用方法,构成调用的完整URL
String apiUrl = configInfo.getUrl() + patternInfo.getInvokeMethod();
HttpPost method = new HttpPost(apiUrl);
//处理+号问题。+号转换为%2B
request = request.replace("+", "%2B");
JSONObject jsonObject = JSON.parseObject(request);

资料.png

以下转自:https://www.cnblogs.com/gzchenjiajun-php/articles/4841529.html

url之所以要编码,不外乎几个原因,比如:url中某些字符会引起歧义、url参数中含有隐私数据、url中参数中含有中文(url编码格式采用ascii而非unicode)等。

一、参数字符串
url参数字符串中使用key=value键值对这样的形式来传递参数,键值对之间以&符号分隔,比如:/ex?i=mm_1_2_3& cb=jsonp_callback。如果value字符串中包含了=或者&,那么就会造成接收url的服务器解析错误,因此,必须对会引起歧义 的符号=和&进行转义,即对其进行编码。
典型的url格式如下:

http://www.jbxue.com:80/ex?i=mm_35055626_3484594_13482142&cb=jsonp_callback_7498#nose
scheme:http://
authority:www.jbxue.com:80
path:/ex
query:?i=mm_35055626_3484594_13482142&cb=jsonp_callback
fragment:#nose

二、编解码字符
rfc3986规定url中只允许包含英文字母(a-za-z)、数字(0-9)、4个特殊字符(-、_、.、~)以及所有保留字符(比如:/、?、 []、@等)。rfc3986对url编码问题做了详细建议,指出了哪些字符需要编码才不会引起url语义歧义,以及对这些字符编码的原因。
url可以划分为若干组件,比如:协议、主机、路径等,保留字符中有些就是用作分隔不同组件的,比如:冒号用于分隔协议和主机,/用于分隔主机和路径,?用于分隔路径和查询参数等,还有一些字符用于每个组件内起到分隔作用,比如:=用于分隔查询参数中的key=value,&用于分隔查询参数中的多个键值对等。当组件中的普通数据包含这些特殊字符使,需要对其进行编码。
rfc3986中指定保留字符包括:!、*、'、()、;、:、@、&、=、+、$、,、/、?、#、[],此外,还有一些字符也不能直接出现在 url中而需要编码,比如:空格、引号、<>、#、%(用作编码时使用的特殊字符)、{}、|、\、^、[]、`、~等。
总之,url中如果出现非字母和数字字符时,就去查一下rfc3986文档以确认是否需要编码,而不是靠臆测。

三、编解码方式
url编码(url encoding)也称为百分号编码(percent-encoding),即其使用百分号(%)加上两位字符(0123456789abcdef)来代 表一个字节的十进制形式(即被编码字符),其实就是用%+两个十六进制字符来表示一个字符。url编码默认使用的字符集是ascii,例如:字符a在 ascii码中对应的十六进制是0x61(十进制是97),那么url编码后得到的就是%61。实际中,字符a是不需要编码的。
对于非ascii字符,需要使用ascii字符集的超集进行编码得到相应的字节,然后对每个字节执行百分号编码。
对于unicode字符,rfc文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。例如:“中文”使用utf-8字符集 得到的字节为0xe4、0xb8、0xad、0xe6、0x96、0x87,经过url编码之后得到%e4、%b8、%ad、%e6、%96、%87。

各种语言都需要编写自己对应的编码和解码函数,c/c++的可以参见这里。此处,以javascript为例说明之,javascript中提供了3对函数用于对url进行编码和解码,分别是escape/unescape、encodeuricomponent/decodeuricomponent、encodeuri/decodeuri。

escape编码基本已经废弃,后两者使用utf-8对非ascii字符进行编码,然后再进行百分号编码,这是rfc推荐使用的方式。

encodeuricomponent和encodeuri区别在于适用场合不同:encodeuricomponent被用作对uri的一个组件进行编码,而encodeuri被用作对一个完整的uri进行编码。
二者编码字符范围不一样,即前者比后者范围大。附上三者无需编解码的字符范围作为结束:

(1)escape(69个):、/、@、+、-、.、_、0-9、a-z、a-z
(2)encodeuricomponent(71个):!、'、()、
、-、.、、~、0-9、a-z、a-z
(3)encodeuri(82个):!、#、$、&、'、()、*、+、,、/、:、;、=、?、@、-、.、
、~、0-9、a-z、a-z

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容