6

我正在使用 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

4

2 回答 2

7

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

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

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

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

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

于 2012-09-27T12:53:12.273 回答
3

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

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

于 2013-10-25T17:21:53.770 回答