Java中的REST POST方法

时间:2018-11-08 19:06:36

标签: java rest post

下面我有这个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方法,为什么?输出流始终处于刷新和关闭状态,为什么我需要读取响应以“激活”服务?

1 个答案:

答案 0 :(得分:2)

引用文档,即基类URLConnection的javadoc:

  

通常,创建到URL的连接是一个多步骤过程:

     
      
  • 通过在URL上调用openConnection方法来创建连接对象。
  •   
  • 操作设置参数和常规请求属性。
  •   
  • 使用connect方法建立了到远程对象的实际连接。
  •   
  • 远程对象变为可用。可以访问标头字段和远程对象的内容。
  •   

在调用connect之前,请求不会发送到服务器。

对任何需要响应的方法的调用都会自动为您调用connect,如connect()方法中所述:

  

URLConnection对象经历两个阶段:首先创建它们,然后将它们连接起来。在创建之后和连接之前,可以指定各种选项(例如doInputUseCaches)。连接后,尝试设置它们是错误的。 依赖于连接的操作(例如getContentLength)将在需要时隐式执行连接。