2012-09-27 27 views
6

我使用dropwizard编写一个Web应用,并且还使用Jersey客户端作为 http://dropwizard.codahale.com/manual/client/#man-client-jerseyJersey客户端没有设置Content-Length的

提及,但似乎每当我试图使用Jersey客户端做一个职位远程webservice抱怨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

回答

7

这就是所谓“问题”,实际上预期的行为。这里

问题是,实体被处理之后头被写出到“导线”,从而Content-Length头值不知道什么时候标头序列化。如果需要,可以有多种选择(具有各种复杂性):

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

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

可能还有一些其他方式如何做到这一点,但我现在想不到另一种方式..希望它有帮助。

+0

感谢您的输入。你知道,如果有打开这个错误,我将有兴趣了解一下这些“其他方式”可能是。 –

3

我面临同样的问题,从帕维尔的答案并没有为我工作了(我使用的是FormMutiPart对象)。

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