3

如果客户端像这样连接到 Web 服务 (JAX-RS):

URL u = new URL(server);
URLConnection con = u.openConnection();
con.setDoOutput(true);
con.getOutputStream().write(stream.toByteArray()); // ByteArrayOutputStream 
con.connect();
InputStream inputStream = con.getInputStream();
byte [] urlBytes = new byte [inputStream.available()];
inputStream.read(urlBytes);
url = new String(urlBytes);

那么 Web 服务接口定义应该是什么?我有:

@POST 
@Path("/upload")
@Consumes("image/jpeg")
@Produces(MediaType.TEXT_PLAIN)
String uploadPicture();

但是,当客户端访问时,它会抛出:

[错误] 信息:生成 jax-rs 代理加载器类。[INFO] DEBUG [SynchronousDispatcher] PathInfo: /blob/upload [INFO] WARN [ExceptionHandler] 执行 POST /blob/upload [INFO] org.jboss.resteasy.spi.UnsupportedMediaTypeException 失败:无法在 org 使用内容类型 [INFO]。 jboss.resteasy.core.registry.Segment.match(Segment.java:117) [INFO] at org.jboss.resteasy.core.registry.SimpleSegment.matchSimple(SimpleSegment.java:33) [INFO] at org.jboss。 resteasy.core.registry.RootSegment.matchChildren(RootSegment.java:327) [INFO] at org.jboss.resteasy.core.registry.SimpleSegment.matchSimple(SimpleSegment.java:44) [INFO] at org.jboss.resteasy。 core.registry.RootSegment.matchChildren(RootSegment.java:327) [INFO] at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:

这个客户端的 JAX-RS 接口应该是什么?

更新:

这里要注意的一件事是客户端代码已经编译和签名,我不能只是更改它。

4

1 回答 1

6

太糟糕了,你不能改变客户端......错误属于那里:

  • 没有设置适当的Content-Type,所以连接将默认为application/x-www-form-urlencoded

  • 然后它将图像数据作为简单流发送(因此未正确编码)

通往可行解决方案的最短(艰难但不那么优雅)路径可能是接受一切:

@POST 
@Path("/upload")
@Consumes("*/*")
@Produces(MediaType.TEXT_PLAIN)
String uploadPicture(InputStream image);
于 2013-09-10T09:55:50.623 回答