實例代碼功能說明:通過客戶端提交的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發起請求,有時間可以嘗試下