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