java - 为什么 OkHttp 不编码百分号?

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

这里的一个副作用是,当我们发布登录表单(用户名和密码)时,如果密码包含“%”(百分号),那么它不会被编码,用户无法登录。这是为什么字符不是由 OkHttp 编码的?

作为引用,以下是我们创建表单的方式( map 包含两个字符串,用户名和密码):

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()。编码方法假设您已经对输入进行了编码。

关于java - 为什么 OkHttp 不编码百分号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45714883/

相关文章:

java - 计算字符串中单词的出现次数

java - 如何找出字符串是否已经被 URL 编码?

javascript - 如何使用 AngularJS 正确发送包含逗号的 URL 参数?

java - 2019年客户端-服务器之间的高效数据库同步

java - Netty - 默认情况下所有创建的缓冲区都是小端字节序

android - 如何使用okhttp来操作Webdav上的文件?

android - Multidex 项目中几个新的 Proguard 问题 Google Play 服务 v10.2.6 到 v11.0.0

java - 如何使用 okhttp3 在 Android 中使用 Twitter Streaming API?

java - 作为 URL 传递的编码参数 - 备用选项?

java - 无法创建和复制文件