【问题标题】:how to remove a header from URLConnection如何从 URLConnection 中删除标头
【发布时间】:2013-01-17 03:23:54
【问题描述】:

我正在与接受发布数据而不是表单数据的文件上传服务交谈。默认情况下,java 的HttpURLConnectionContent-Type 标头设置为application/x-www-form-urlencoded。如果我发布纯数据,这显然是错误的。

我(客户)不知道内容类型。我根本不想设置 Content-Type 标头。该服务具有猜测内容类型的功能(基于文件名、从文件中读取一些数据等)。

如何取消设置标题?没有删除标头,将其设置为null 不会更改值并将其设置为空字符串会导致标头设置为没有值。

【问题讨论】:

  • 你找到什么办法了吗?

标签: java post content-type httpurlconnection urlconnection


【解决方案1】:

我没有测试过这种方法,但你可以试试这个:

扩展 HttpURLConnection 并尝试覆盖它的 getContentHandler() 和 setContentHandler(...) 方法。这很可能应该起作用,您将查看 getContentHandler() 的代码。

【讨论】:

    【解决方案2】:

    使用 Apache HttpClient 代替 URLConnection

    使用流利的Request 生成您的请求

    使用 removeHeader()

    【讨论】:

    • 不是一个选项,因为我需要生成一个可以在 android 和纯 JSE 上运行的库。 android 的问题在于它捆绑了一个 4.x 版本的 httpclient,它与任何独立发布的版本都不匹配。如果您尝试捆绑特定版本的 httpclient,则会发生冲突。
    • 我尝试实现一个使用 Google 图片搜索(不使用自定义搜索)的机器人,而 Google 图片搜索似乎不发送 Content-TypeContent-Length 标头,所以我有同样的问题。而且 apache httpcomponents 的 HttpClient 也不适合我的情况:HttpClient 不支持 SOCKS 代理(需要调整,我不喜欢那样)。
    【解决方案3】:

    “我根本不想设置 Content-Type 标头”是什么意思?

    浏览器(或其他 http 客户端)将您的 post 请求发送到服务器,因此它必须通知服务器它对参数的编码方式。

    如果没有设置 Content-Type 标头,在服务器端,您(=您的服务器)将无法理解如何解析接收到的数据。

    如果没有设置Content-Type,则使用默认值。

    您的浏览器(或其他 http 客户端)必须做两件事:

    1. 发送键/值对。
    2. 通知服务器键/值对是如何编码的。

    所以,完全摆脱这个头是不可能的。

    【讨论】:

    • 我没有发送参数。是文件上传。我正在发布二进制数据。该服务按原样保存二进制内容。它需要内容类型的唯一原因是为文件设置元数据。
    • 如果您将图片文件上传到谷歌图片搜索,浏览器不会发送Content-Type 标头,并且Content-Length 标头也会丢失。
    【解决方案4】:

    我刚刚通过将标头设置为 null 来完成此操作。

    connection.setRequestProperty(MY_HEADER, null);
    

    【讨论】:

    • 对于User-Agent,它只是额外写入User-Agent,不带冒号或值,然后写入原始值。不理想。
    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 2010-09-21
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2014-10-16
    • 1970-01-01
    相关资源
    最近更新 更多