为什么 OkHttp 不对百分号进行编码?
Why doesn't OkHttp encode the percent sign?
来自HttpUrl.java:
static final String FORM_ENCODE_SET = " \"':;<=>@[]^`{}|/\?#&!$(),~";
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;
}
这里的一个副作用是当我们post一个登录表单(用户名和密码)时,如果密码包含'%'(百分号),那么它没有被编码并且用户不能登录。为什么这个字符不是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();
}
使用 FormBody.Builder.add()
而不是 addEncoded()
。 encoded 方法假定您已经对输入进行了编码。
来自HttpUrl.java:
static final String FORM_ENCODE_SET = " \"':;<=>@[]^`{}|/\?#&!$(),~";
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;
}
这里的一个副作用是当我们post一个登录表单(用户名和密码)时,如果密码包含'%'(百分号),那么它没有被编码并且用户不能登录。为什么这个字符不是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();
}
使用 FormBody.Builder.add()
而不是 addEncoded()
。 encoded 方法假定您已经对输入进行了编码。