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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章