为什么OkHttp不对百分号进行编码?

时间:2017-08-16 13:26:06

标签: java okhttp url-encoding

来自HttpUrl.java

static final String FORM_ENCODE_SET = " \"':;<=>@[]^`{}|/\\?#&!$(),~";

来自FormBody.java

public Builder addEncoded(String name, String value) {
      names.add(HttpUrl.canonicalize(name, FORM_ENCODE_SET, true, false, true, true, charset));
      values.add(HttpUrl.canonicalize(value, FORM_ENCODE_SET, true, false, true, true, charset));
      return this;
    }

这里的副作用是当我们发布登录表单(用户名和密码)时,如果密码包含&#39;%&#39; (百分号),然后它没有编码,用户无法登录。为什么这个字符不是由OkHttp编码的?

供参考,以下是我们如何创建表单(地图包含两个字符串,用户名和密码):

public RequestBody createEncodedFormBody(final Map<String, String> content) {
        final FormBody.Builder builder = new FormBody.Builder();
        for (final Entry<String, String> contentEntry : content.entrySet()) {
            builder.addEncoded(contentEntry.getKey(), contentEntry.getValue());
        }
        return builder.build();
    }

1 个答案:

答案 0 :(得分:3)

使用FormBody.Builder.add()代替addEncoded()。编码方法假设您已经对输入进行了编码。