下面我有这个RESTful服务:
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response add(Student student) {
if (service.add(student)) {
return Response.status(200).entity(student).build();
} else {
return Response.status(500).entity("Error").build();
}
}
以及对该服务的使用:
public static void createStudent(String studentJsonString) {
try {
// priprema i otvaranje HTTP zahtjeva
URL url = new URL(BASE_URL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST"); //
conn.setRequestProperty("Content-Type", "application/json");
// podaci za body dio zahtjeva
JSONObject input = new JSONObject(studentJsonString);
// slanje body dijela
OutputStream os = conn.getOutputStream();
os.write(input.toString().getBytes());
os.flush();
// @problem line
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
os.close();
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
这可行。但是,如果我注释了获取响应代码的行,则服务器端不会进入add方法,为什么?输出流始终处于刷新和关闭状态,为什么我需要读取响应以“激活”服务?
答案 0 :(得分:2)
引用文档,即基类URLConnection
的javadoc:
通常,创建到URL的连接是一个多步骤过程:
- 通过在URL上调用
openConnection
方法来创建连接对象。- 操作设置参数和常规请求属性。
- 使用
connect
方法建立了到远程对象的实际连接。- 远程对象变为可用。可以访问标头字段和远程对象的内容。
在调用connect
之前,请求不会发送到服务器。
对任何需要响应的方法的调用都会自动为您调用connect
,如connect()
方法中所述:
URLConnection对象经历两个阶段:首先创建它们,然后将它们连接起来。在创建之后和连接之前,可以指定各种选项(例如
doInput
和UseCaches
)。连接后,尝试设置它们是错误的。 依赖于连接的操作(例如getContentLength
)将在需要时隐式执行连接。