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

项目技术:Angular 6

问题现象:接口传参的时候,使用 httpClient.post 方法提交数据,字段中包含+号被解析成空格,提交数据错误

解决过程:

1、http请求中包含+号,会被自动解析成空格,必须将加号替换成 '%2B',则数据提交正常,如下测试代码

<!DOCTYPE html>
<html>
<head>
</head>
<body>
  <input type="text" id="createResult" />
  <input type="text" id="staffName" />
  <input type="text" id="staffNumber" />
  <input type="text" id="staffSex" />
  <input type="text" id="staffJob" />
  <input type="button" id="btnSave" onclick="btn()"  value="发送请求"/>
  <script>
    function createXHR() {
      if (typeof XMLHttpRequest != "undefined") {

        return new XMLHttpRequest();
      } else if (typeof ActiveXObject != "undefined") {

        if (typeof arguments.callee.activeString != "string") {
          var versions = ["MSXML2.XMLHTTP6.0", "MSXML2.XMLHTTP3.0", "MSXML2.XMLHTTP"], i, len;
          for (i = 0; len = versions.lengthli < len; i++) {
            try {
              new ActiveXObject(versions[i]);
              arguments.callee.activeString = versions[i];
              break;
            } catch (ex) {
              //跳过
            }
          }
        }
        return new ActiveXObject(arguments.callee.activeString);
      } else {
        throw new Error("无可用XHR");
      }
    }

    function btn() {
      var createResult = document.getElementById("createResult");
      var data = "name=" + document.getElementById("staffName").value.replace(/\+/g, "%2B")
        + "&number=" + document.getElementById("staffNumber").value.replace(/\+/g, "%2B")
        + "&sex=" + document.getElementById("staffSex").value.replace(/\+/g, "%2B")
        + "&job=" + document.getElementById("staffJob").value.replace(/\+/g, "%2B");
      var request = createXHR();
      request.onreadystatechange = function () {
        if (request.readyState === 4) {
          if (request.status === 200) {
            createResult.innerHTML = request.responseText;
          } else {
            alert("发生错误" + request.status);
          }
        }
      };
      request.open("POST", "http://kjss.kuaijisishu.cn/expense.html?list&isArrearage1=&handleUserId=&field=id,stuNo,stuName,telphone,planclassesName,shouldPayFee,havePayFee,discountFee,returnFee,remainPayFee,lastPayDate,buildDate,returnState,handleUserName,licenseCode,domain,orgName,", false);
      request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      request.send(data);
    }
  </script>
</body>

</html>

2、在angularjs提交时,将+号replace成%2b,但提交的数据仍然是空格

所以,调试angular源码,发现,HttpUrlEncodingCodec 中包含这么段代码,将数据又解析回去:

  encodeKey(k: string): string {
        return this.encode(k);
    }
    encodeValue(v: string): string {
        return this.encode(v);
    }

    private encode(v: string): string {
        return encodeURIComponent(v)
        .replace(/%40/gi, '@')
        .replace(/%3A/gi, ':')
        .replace(/%24/gi, '$')
        .replace(/%2C/gi, ',')
        .replace(/%3B/gi, ';')
        .replace(/%2B/gi, '+')
        .replace(/%3D/gi, ';')
        .replace(/%3F/gi, '?')
        .replace(/%2F/gi, '/');
  }

 

3、到angular的github的 issue中找,果然发现有很多人有同样的问题,其中有包含解决方案。

参考资料:https://github.com/angular/angular/issues/11058

 

 

解决方案:重写Angular的参数编码方式(HttpUrlEncodingCodec )

//解决http请求+号显示空格问题
class GhQueryEncoder extends HttpUrlEncodingCodec {
  encodeKey(k: string): string {
    k = super.encodeKey(k);
    return this.replaceCharacter(k);
  }
  encodeValue(v: string): string {
    v = super.encodeKey(v);
    return this.replaceCharacter(v);
  }
  replaceCharacter(v) {
    return v.replace(/\+/gi, '%2B');
  }
}

 

转载于:https://www.cnblogs.com/alwaysblog/p/11290548.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中获取请求体的JSON并解析为JSON对象时出现了参数含有空格和乱码的问题。出现这个问题可能是由于请求体JSON中的参数中含有空格或者非UTF-8编码导致的。 要解决这个问题,首先需要检查并确认请求体JSON中的参数是否正确且符合JSON格式的规范。如果参数含有空格或其他特殊字符,建议在发送请求时对参数进行URL编码,确保其在传输过程中不会出现乱码。 在Java代码中,可以使用URLDecoder对请求体JSON进行解码。例如,可以使用如下代码获取请求体中的JSON字符串,并进行解码: String body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator())); String decodedBody = URLDecoder.decode(body, "UTF-8"); 接下来,可以使用JSON库(如Jackson、Gson等)将解码后的JSON字符串解析为JSON对象。例如,对于使用Jackson库的情况,可以使用如下代码将解码后的JSON字符串解析为JSON对象: ObjectMapper mapper = new ObjectMapper(); JsonNode jsonNode = mapper.readTree(decodedBody); 在解析JSON对象之后,可以通过遍历JSON对象的属性、调用对应的getter方法等获取具体的参数,进行后续的业务逻辑处理。 综上所述,要解决Java获取请求体JSON解析为JSON对象参数含有空格乱码的问题,需要注意参数的格式以及编码方式,并在Java代码中正确解码和解析JSON对象。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值