Rest服务实现返回List<Map>结果

来源:互联网 发布:网络教育本科能考研吗 编辑:程序博客网 时间:2024/06/15 13:25

实例代码功能说明:通过客户端提交的sql语句,调用Rest服务完成查询,返回List<Map<String, Object>>格式的查询结果


服务端代码:

import java.net.URLDecoder;import java.util.List;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.PathParam;import javax.ws.rs.Produces;import javax.ws.rs.core.*;@Produces({ MediaType.APPLICATION_JSON })@Path("query")public class QueryService {@GET@Path("sql/{param}")public List<java.util.Map<String, Object>> query(@PathParam("param") String sql) {System.out.println(sql);return JdbcUtils.getInstance().query(URLDecoder.decode(sql));}}



客户端说明:

(1)采用标准jdk接口发起请求

(2)使用jackson方式将结果为json格式的数据解析为List<Map>结构,注意避免jackson包与spring自带jackson包的冲突

(3)需要对传入的sql语句进行url编码

(4)需要进行乱码处理

客户端代码:

public class RESTNetClient {private static String targetURL = "http://localhost:8080/Sub1/services/query/sql/";public static void main(String[] args) {javaNetClient();}public static void javaNetClient() {String sql = "select * from stu where stu.stu_sex='男'";try {// 处理sql中带中文时的乱码问题URL restServiceURL = new URL(targetURL+ URLEncoder.encode(sql, "UTF-8"));HttpURLConnection httpConnection = (HttpURLConnection) restServiceURL.openConnection();httpConnection.setRequestMethod("GET");// 处理返回json数据中带中文时的乱码问题httpConnection.setRequestProperty("Accept-Charset", "UTF-8");httpConnection.setRequestProperty("contentType", "UTF-8");if (httpConnection.getResponseCode() != 200) {throw new RuntimeException("HTTP GET Request Failed with Error code : "+ httpConnection.getResponseCode());}BufferedReader responseBuffer = new BufferedReader(new InputStreamReader((httpConnection.getInputStream()),"utf-8"));StringBuilder result = new StringBuilder();String output;System.out.println("Output from Server:  \n");while ((output = responseBuffer.readLine()) != null) {result.append(output);}System.out.println(result);List<Map<String, Object>> lm = listKeyMaps2(result.toString());print(lm);httpConnection.disconnect();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}// jackson解析@SuppressWarnings("unchecked")public static List<Map<String, Object>> listKeyMaps2(String jsonString) {List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();ObjectMapper objectMapper = new ObjectMapper();try {list = objectMapper.readValue(jsonString, List.class);} catch (JsonParseException e) {e.printStackTrace();} catch (JsonMappingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return list;}}



说明:

(1)Rest方式提供的webservice比SOAP方式(如JAX-WS)在处理复杂对象序列化时更好用,如果用JAX-WS,还需要在服务端编写相应的XmlAdapter;同时,Rest服务在客户端调用时只需提供url访问连接,可以更方便地实现动态调用(即在不知道要调用的具体服务时,通过传入url完成调用)

(2)如果用Gson进行json解析,会出现将数字自动转换成小数的情况,暂时还未解决,所以采用了jackson,而且jackson性能更好

(3)客户端也可以采用spring提供的RestTemplate发起请求,有时间可以尝试下

1 0
原创粉丝点击