🍃實際開發中我們經常遇到接口開發,一些較老的項目,采用的是java內置的HttpServer類實現的Restful服務。
HttpServer是JDK1.6以后內置的HTTP服務器,位置在rt.jar的com.sun.net.httpserver包下,支持http和https協議。
🍃該技術主要用到HttpServer類 ,Handler接口實現類,以及HttpExchange類。我們用HttpServer調用Handler接口實現類,通過HttpExchange接受請求信息,並處理返回信息。
解析:
1、HttpServer:表示一個服務器實例,需要綁定一個IP地址和端口號。(HttpsServer是其子類,處理https請求)
2、HttpContext:服務器監聽器的上下文,需要配置用於匹配URI的公共路徑和用來處理請求的HttpHandler
(可以創建多個 HttpContext,一個 HttpContext 對應一個 HttpHandler,不同的 URI 請求,根據添加的 HttpContext 監聽器,分配到對應的 HttpHandler 處理請求)
3、HttpHandler:上下文對應的http請求處理器
4、HttpExchange:監聽器回調時傳入的參數,封裝了http請求和響應的所有數據操作
實現代碼:
1)創建HtttpServer主程序,開啟服務:
public class Server { public static void main(String[] args) throws Exception { // start port:8080 HttpServerProvider provider = HttpServerProvider.provider(); HttpServer server = provider.createHttpServer(new InetSocketAddress(8080), 10); server.createContext("/findAllOrderHistory", new OrderHistory()); server.setExecutor(null); server.start(); } }
2)OrderHistory 實現HttpHandler接口
public class OrderHistory implements HttpHandler { @Override public void handle(HttpExchange var1) throws IOException { // 獲取請求參數 此代碼塊是實現接收請求參數page、pageSize,條件判斷則為防止參數位置前后不分(此處不用糾結) // 獲取參數 由var1..getRequestURI().getQuery()獲取,按需所用,無參則不用管,直接下一步 String[] pages,pageSizes = new String[0]; String queryString = var1.getRequestURI().getQuery(); String [] strs = queryString.split("[&]"); if (strs[0].contains("pageSize")){ pageSizes = strs[0].split("[=]"); pages = strs[1].split("[=]"); }else { pages = strs[0].split("[=]"); pageSizes = strs[1].split("[=]"); } Integer page = Integer.valueOf(pages[1]); Integer pageSize = Integer.valueOf(pageSizes[1]); //工具類方法→獲取數據轉成Json返回 // JDBCUtils.findAllOrderHistoryByPage是我自己寫的一個JDBC讀取數據庫數據,數據獲取自行解決 ArrayList<OrderHistoryVO> allOrderHistory = JDBCUtils.findAllOrderHistoryByPage(page,pageSize); JSONArray orderJsonArray = new JSONArray(); orderJsonArray = JSONArray.parseArray(JSONArray.toJSONString(allOrderHistory)); //接口返回數據如下,照寫即可 var1.sendResponseHeaders(200, 0); OutputStream os = var1.getResponseBody(); os.write(orderJsonArray.toJSONString().getBytes()); os.close(); }
3) 啟動主程序,然后調用就可以看見返回結果了。客戶端可以自己寫,也可以直接訪問網頁。
我的如下圖所示: