最近的一段时间一直在研究有关rest的资料。相信有不少人也都或多或少的接触过rest架构。rest是一直新的规范,现在java中,.net中也都有针对rest开发的一些框架。我最近也研究了不少框架,但最后还是决定用http的方式来访问rest结构的数据。即使用Http的GET,PUT,POST和DELETE来对rest结构的数据进行操作。
因为我是做java的,所以我主要针对java来说。java中实现Http访问rest,主要是通过一个类,HttpURlconnection,使用这个类来实现的。下面请看一下代码:
/** * 执行REST的post方法 * @param urlStr * @param param * @param accept * @return 成功:true / 失败:false * @throws Exception * * @author 10050315 */ public static String doPost(String urlStr, String param, String accept) throws Exception { boolean state = false; URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置发送请求的方式 conn.setRequestMethod(SERVLET_POST); // 设置参数的格式类型 conn.setRequestProperty("Content-Type", accept); // 打开输入输出,在output中传输参数 conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); // 把参数写入output流,使用UTF-8编码 os.write(param.getBytes("utf-8")); os.close(); // 正常时返回的状态码为200 if (conn.getResponseCode() == 200) { state = true; // 获取返回的内容 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); // 输出返回的信息 String line; while ((line = br.readLine()) != null) { System.out.println(line); return line; } br.close(); } else { System.out.println(SERVLET_POST + " [ERROR] CODE: " + conn.getResponseCode()); } return "get error:no value"; }
这是针对post方法来说的,可以使用这个方法,来传到你想要传的webservice接口,并返回一个数据。
下面这个方法是GET方法,主要用来获取数据的:
/** * 执行REST的get方法 * @param urlStr * @param accept * @return REST返回的数据 * @throws Exception * * @author 10050315 */ public static String doGet(String urlStr, String accept) throws Exception { String state = ""; URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置发送请求的方式 conn.setRequestMethod(SERVLET_GET); // 设置返回信息的格式类型 conn.setRequestProperty("Accept", accept); conn.connect(); // 正常时返回的状态码为200 if (conn.getResponseCode() == 200) { // 获取返回的内容 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; // 输出返回的信息 while ((line = br.readLine()) != null) { state += line; } br.close(); } else { System.out.println(SERVLET_GET + " [ERROR] CODE: " + conn.getResponseCode()); } return state; }
下面这个PUT方法,可以用来保存REST数据,也可以写入数据库中,目前我们使用的是非关系型数据库:
/** * 执行REST的put方法 * @param urlStr * @param param * @param accept * @return 成功:true / 失败:false * @throws Exception * * @author 10050315 */ public String doPut(String urlStr, String param, String accept) throws Exception { boolean state = false; URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置发送请求的方式 conn.setRequestMethod(SERVLET_PUT); // 设置参数的格式类型 conn.setRequestProperty("Content-Type", accept); // 打开输入输出,在output中传输参数 conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); // 把参数写入output流,使用UTF-8编码 os.write(param.getBytes("utf-8")); os.close(); // 正常时返回的状态码为200 if (conn.getResponseCode() == 200) { state = true; // 获取返回的内容 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); // 输出返回的信息 String line; while ((line = br.readLine()) != null) { System.out.println(line); return line; } br.close(); } else { System.out.println(SERVLET_PUT + " [ERROR] CODE: " + conn.getResponseCode()); } return "return error:put failure"; }
最后一个DELETE方法,用来删除数据的方法:
/** * 执行REST的delete方法 * @param urlStr * @param accept * @return REST返回的数据 * @throws Exception * * @author 10050315 */ public String doDelete(String urlStr, String accept) throws Exception { boolean state = false; URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置发送请求的方式 conn.setRequestMethod(SERVLET_DELETE); // 设置返回信息的格式类型 conn.setRequestProperty("Accept", accept); // 正常时返回的状态码为200 if (conn.getResponseCode() == 200) { return "success"; } else { System.out.println(SERVLET_DELETE + " [ERROR] CODE: " + conn.getResponseCode()); } return ""; }