这是我的java.net客户端代码
URL server = new URL(serverUrl);
URLConnection connection = server.openConnection();
/* DoOutput flag is set to true to inform URL connection that we are
* sending data out. The default behavior is false. This will change
* the request from GET to a POST.
*/
connection.setDoOutput (true);
/* Setting the UseCaches to false allows the application "tunnel
* through" and ignore the caches.
*/
connection.setUseCaches (false);
connection.setRequestProperty ( "Content-Type", "application/octet-stream" );
ObjectOutputStream sendData = new ObjectOutputStream(connection.getOutputStream());
sendData.writeObject(packet);
sendData.flush();
sendData.close();
ObjectInputStream recieveData = new ObjectInputStream(connection.getInputStream());
response = (Serializable) recieveData.readObject();
System.out.println(response);
recieveData.close();
这是我的服务器代码与spring一起接收请求并发回响应
@ResponseBody
@RequestMapping(value="/upload", method=RequestMethod.POST)
public Serializable fileUploadHandler(@RequestBody FilePacket packet, HttpServletRequest request, HttpSession session, HttpServletResponse response){
// handle request
return "response";
}
在运行具有上述配置的代码时,在向服务器发送请求时,我得到Http错误415
java.io.IOException: Server returned HTTP response code: 415 for URL:
我删除了@RequestBody
并将其替换为
FilePacket packet = (FilePacket) new ObjectInputStream(request.getInputStream()).readObject();
请求部分很好。但在一次请求后,我得到了406
java.io.IOException: Server returned HTTP response code: 415 for URL:
所以我用代替了@ResponseBody
new ObjectOutputStream(response.getOutputStream()).writeObject("response");
然后一切都很好。
我已经在ajax中使用了这些注释,它们的工作方式很有魅力,但在java.net中,我得到了不受支持的媒体类型(415)和不可接受的(406)。spring是否无法阅读请求并发送正确的响应,或者我在这里遗漏了什么?有办法让它发挥作用吗?
注意:类FilePacket
是Serializable
,其中一个字段的类型为byte[]
,用于保存文件数据。
Spring使用HttpMessageConverter
实例的集合将请求体反序列化为将传递给处理程序方法的参数。
Spring没有这样一个HttpMessageConverter
,它将application/octet-stream
转换为您的自定义FilePacket
类。您可以使用byte[]
自己进行转换(或者提供自己的HttpMessageConverter
来进行转换)。
Spring对@ResponseBody
使用相同的策略,使用这些相同的HttpMessageConverter
实例序列化返回到响应主体的对象。它没有使用Java序列化的内置功能。请注意,对于这些响应类型中的大多数(如果不是全部的话),您的客户端需要提供一个明确的Accept:
标头来指定它接受的内容。