gpt4 book ai didi

java - 通过 Jersey 和 x-www-form-urlencoded 发送文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:53:40 25 4
gpt4 key购买 nike

我正在尝试使用以下客户端代码调用 REST 服务,以发送一些字符串消息详细信息以及附件文件:

ClientConfig config = new DefaultClientConfig();
config.getClasses().add(FormProvider.class);
Client client = Client.create(config);
WebResource webResource = client.resource("http://some.url/path1/path2");

File attachment = new File("./file.zip");

FormDataBodyPart fdp = new FormDataBodyPart(
"content",
new ByteArrayInputStream(Base64.encode(FileUtils.readFileToByteArray(attachedLogs))),
MediaType.APPLICATION_OCTET_STREAM_TYPE);
form.bodyPart(fdp);

ClientResponse response = webResource.type(MediaType.APPLICATION_FORM_URLENCODED).post(ClientResponse.class, form);

我的目标服务器接受 Base64 编码的内容,因此这就是从文件到 ByteArray 的额外传输的原因。

此外,我发现 com.sun.jersey.core.impl.provider.entity.FormProvider 类在“x-www-form-urlencoded”请求的生产和消费方面都得到了注意。

@Produces({"application/x-www-form-urlencoded", "*/*"})
@Consumes({"application/x-www-form-urlencoded", "*/*"})

但我最终还是得到了以下堆栈跟踪:

com.sun.jersey.api.client.ClientHandlerException: com.sun.jersey.api.client.ClientHandlerException: A message body writer for Java type, class com.sun.jersey.multipart.FormDataMultiPart, and MIME media type, application/x-www-form-urlencoded, was not found at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149) ~[jersey-client-1.9.1.jar:1.9.1]
at com.sun.jersey.api.client.Client.handle(Client.java:648) ~[jersey-client-1.9.1.jar:1.9.1]
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670) ~[jersey-client-1.9.1.jar:1.9.1]
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) ~[jersey-client-1.9.1.jar:1.9.1]
at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:563) ~[jersey-client-1.9.1.jar:1.9.1]

这方面有什么帮助吗?

最佳答案

我设法让这个东西在客户端工作。问题是我强制将文件作为单独的消息正文部分发送,而 x-www-form-urlencoded is actually packing all of the data as parameters in the query that is the entire body .

因此,如果您想通过 Jersey post 方法发送附件,工作客户端代码将是:

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource webResource = client.resource("http://some.url/path1/path2");

MultivaluedMapImpl values = new MultivaluedMapImpl();
values.add("filename", "report.zip");
values.add("text", "Test message");
values.add("content", new String(Base64.encode(FileUtils.readFileToByteArray(attachedLogs))));
ClientResponse response = webResource.type(MediaType.APPLICATION_FORM_URLENCODED).post(ClientResponse.class, values);

在我的案例中需要 Apache Commons 的 Base64 编码器将文件转换为编码字节数组,不确定这是否是一般要求。

关于java - 通过 Jersey 和 x-www-form-urlencoded 发送文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10687886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com