如何将InputStream张贴为Retrofit中的请求主体?

我正在尝试使用类似于以下内容的InputStream来执行POST:

@POST("/build")

@Headers("Content-Type: application/tar")

Response build(@Query("t") String tag,

@Query("q") boolean quiet,

@Query("nocache") boolean nocache,

@Body TypedInput inputStream);

在这种情况下,InputStream来自压缩的tar文件。

张贴InputStream的正确方法是什么?

回答:

我在这里想到的唯一解决方案是使用TypeFile类:

TypedFile tarTypeFile = new TypedFile("application/tar", myFile);

和接口(这次没有显式设置Content-Type标头):

@POST("/build")

Response build(@Query("t") String tag,

@Query("q") boolean quiet,

@Query("nocache") boolean nocache,

@Body TypedInput inputStream);

使用我自己的TypedInput实现会导致模糊的EOF异常,即使我提供了length()。

public class TarArchive implements TypedInput {

private File file;

public TarArchive(File file) {

this.file = file;

}

public String mimeType() {

return "application/tar";

}

public long length() {

return this.file.length();

}

public InputStream in() throws IOException {

return new FileInputStream(this.file);

}

}

另外,在解决此问题时,我尝试使用最新的Apache Http客户端而不是OkHttp,这会导致“ Content-

Length标头已存在”错误,即使我没有明确设置该标头也是如此。

以上是 如何将InputStream张贴为Retrofit中的请求主体? 的全部内容, 来源链接: utcz.com/qa/415749.html

回到顶部