当前位置: 首页 > 知识库问答 >
问题:

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

曾丰茂
2023-03-14

我试图使用以下客户端代码调用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]

有什么帮助吗?

共有2个答案

佟翰林
2023-03-14

尝试使用Multipart/form data而不是application/x-www-form-urlencoded。本教程可能会有所帮助。

姜俊逸
2023-03-14

我设法让这件事在客户方面起作用。问题是,我强制将文件作为单独的消息体部分发送,而x-www-form-urlencoded实际上是将所有数据作为参数打包到整个查询体中。

因此,如果您想通过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编码器将文件转换为编码字节数组,不确定这是否是一般要求。

 类似资料:
  • 我有一个Jersey 2.22 rest web服务,我的一个endpoint有以下签名: 我使用PostMan调用这个web服务,在post请求中不传递任何特定的头,我将“query”form param传递为“x-www-form-urlencoded”。 jersey应用程序由Tomcat 7托管,该Tomcat 7以JVM编码UTF-8文件启动。编码UTF-8,并将连接器的URIEncod

  • 在java中,如何使用。我不明白如何发送带有键值的正文,如上面的屏幕截图所示。 我尝试过以下代码: 但是在回复中,我没有收到正确的数据。

  • 它回来了 对此有什么建议吗?内容类型应为application/x-www-form-urlencoded。

  • 当内容类型不是text/html、text/plain或text/xml,而是application/x-www-form-urlencoded内容类型时,我很难理解如何设置字符集。 给出以下(简化的)javascript代码: 如果我没有显式设置编码, Firebug告诉我内容类型是"Application/x-www-form-urlencoded; charset=UTF-8"。 例如,如果

  • 我正在使用最新版本的openapi-用户界面1.6.7,我无法使文件上传endpoint工作。这是我对参数的配置: 当我在生成的招摇过市UI中使用“试用”按钮时,会出现415个不支持的媒体类型错误。请求头的内容类型为: 我认为这就是错误的来源。从OpenApi生成的json如下所示: 我缺少什么来发送表单数据内容类型的正确请求?

  • 问题内容: 之间有什么区别 request.ContentType =“ application / json; charset = utf-8”; 和 webRequest.ContentType =“ application / x-www-form-urlencoded”; 问题答案: 第一种情况是告诉Web服务器您正在发布JSON数据,如下所示: 第二个选项是告诉Web服务器您将对URL中