2017-08-16 208 views
2

HttpUrl.javaOkHttp为什么不对百分号进行编码?

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; 
    } 

这里的一个副作用是,当我们发布一个登录表单(用户名和密码),如果密码包含一个“%”(百分号),那么它不会被编码,用户也不能登录。为什么这个字符不是由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

使用FormBody.Builder.add(),而不是addEncoded()。编码方法假定您已经编码了输入。

+1

圣牛我很尴尬,我们没有捕捉到。谢谢!!! –

+0

@EricKerwin在这里同样的东西:)我知道它向后 –