我正在使用dropwizard编写webapp并使用Jersey Client,如上所述 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
答案 0 :(得分:7)
这是已知的“问题”,实际上是预期的行为。
这里的问题是,在将标题写入“连线”之后处理实体,因此在标题被序列化时不知道Content-Length标头值。如果你需要它,你有几个选择(具有不同的复杂性):
自己序列化实体;如果您将实体提供为字符串(或byte []),则应设置Content-Length。
创建自己的MessageBodyWriter,它将在getSize()方法调用中计算实体的大小。
可能还有其他一些方法可以做到这一点,但我现在想不出另一种方式..希望它有所帮助。
答案 1 :(得分:3)
我遇到了同样的问题,Pavel的答案对我来说没有用(我使用的是FormMutiPart对象)。
我使用 ApacheHttpClient4 而不是常规 com.sun.jersey.api.client.Client 。更改回Jersey客户端,计算Content-Lenght(至少在FormMultiPart实体的情况下)。