天天看點

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發起請求,有時間可以嘗試下