【问题标题】:Jersey Client doesn't set Content-LengthJersey 客户端未设置 Content-Length
【发布时间】:2012-09-27 04:35:13
【问题描述】:

我正在使用 dropwizard 编写 web 应用程序并使用 Jersey 客户端,如在 http://dropwizard.codahale.com/manual/client/#man-client-jersey

但似乎每当我尝试使用 jersey 客户端发帖时,远程 Web 服务都会抱怨 Content-Length 标头丢失并且失败。

public JobResponse createJob(JobRequest job) {
        return jerseyClient.resource(URI.create(JOBS_URL))
                .type(MediaType.APPLICATION_JSON_TYPE)
                .header("Api-Key", job.getApiKey())
                .post(JobResponse.class, job);
    }

我已确认该请求不包含标头,尽管我尽了最大努力,但仍无法弄清楚为什么会发生这种情况。有谁知道我是否遗漏了什么?

PS:我要访问的服务是https://app.zencoder.com/docs/api/jobs/create

【问题讨论】:

    标签: java http jersey dropwizard


    【解决方案1】:

    这是已知的“问题”和实际预期的行为。

    这里的问题是实体在标头被写入“线路”之后处理,因此 Content-Length 标头值在标头被序列化时不知道。如果您需要它,您有多种选择(具有各种复杂性):

    1. 自行序列化实体;如果您将实体作为字符串(或字节[])提供,则应设置 Content-Length。

    2. 创建您自己的 MessageBodyWriter,它将在 getSize() 方法调用中计算实体的大小。

    可能还有其他方法可以做到这一点,但我现在想不出另一种方法......希望它有所帮助。

    【讨论】:

    • 感谢您的意见。你知道是否有一个错误开放,我很想知道这些“其他方式”可能是什么。
    【解决方案2】:

    我遇到了同样的问题,Pavel 的回答对我来说并不奏效(我使用的是 FormMutiPart 对象)。

    我使用的是 ApacheHttpClient4 而不是常规的 com.sun.jersey.api.client.Client。改回 Jersey 客户端,计算 Content-Lenght(至少在 FormMultiPart 实体的情况下)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-04
      • 2012-05-12
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多