天天看点

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

实例代码功能说明:通过客户端提交的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发起请求,有时间可以尝试下