【问题标题】:Java Apache HTTPClient do not encode POST entityJava Apache HTTPClient 不编码 POST 实体
【发布时间】:2013-02-15 08:28:55
【问题描述】:

我有一个端点需要一个“authenticity_token”,格式如下:

Iq2rNXN+OxERv+s6TSloJfKkPZVvqnWe1m0NfODB5OI=

但是,有时它有“特殊”字符,例如:

E7IzeP73OgPGgXM/up295ky1mMQMio2Nb8HMLxJFyfw=

这被编码为:

E7IzeP73OgPGgXM%26%2347%3Bup295ky1mMQMio2Nb8HMLxJFyfw%3D

由于某种原因,端点不喜欢那些特殊字符的编码,会认为令牌无效。是否可以添加不编码特定值的 POST 变量?我目前正在做类似的事情:

    HttpPost post = new HttpPost(URL + NEW_FINDING);
    List <NameValuePair> nvps = new ArrayList <NameValuePair>();
    nvps.add(new BasicNameValuePair("foo", foo));
    nvps.add(new BasicNameValuePair("authenticity_token", authenticityToken));
    post.setEntity(new UrlEncodedFormEntity(nvps));

【问题讨论】:

    标签: java apache httpclient


    【解决方案1】:

    您始终可以使用ByteArrayEntityStringEntity 而不是UrlEncodedFormEntity 并自己进行编码。它应该类似于foo=var1&amp;bar=var2
    你必须设置Content-Type=application/x-www-form-urlencoded
    您可能想找出端点期望的内容类型标头的 application/x-www-form-urlencoded 值的字符集参数。然后将其作为参数传递给UrlEncodedFormEntity 构造函数。这应该是正确的解决方法。

    【讨论】:

    • 问题是id喜欢使用UrlEncodedFormEntity作为其余参数,我只需要能够不编码authentity_token...
    • 然后只使用第一个选项:ByteArrayEntity 或 StringEntity with Content-Type=application/x-www-form-urlencoded。 UrlEncodedFormEntity 正是这样做的,但它会为您编码参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多