摘要:今天我瞎翻的源代碼,發(fā)現(xiàn)可以用包下提供的很快速的創(chuàng)建服務(wù),它的創(chuàng)建方式和極其的類似。創(chuàng)建服務(wù)創(chuàng)建服務(wù)并注冊前面創(chuàng)建的,使用來處理請求。使用默認的只要運行這個方法,一個服務(wù)就啟動了,監(jiān)聽端口是,下面是我寫了兩個完整的例子。
我最開始學(xué)習(xí) Java web 編程是要去寫一個 servlet, 重寫里面的 service 方法,然后去配置 web.xml 文件,最后就是部署到 tomcat 或者 jetty 容器中并啟動。后來就是使用一些框架,struts2 SpringMvc。今天我瞎翻 JDK 的源代碼,發(fā)現(xiàn)可以用 com.sun.net.httpserver 包下提供的 API 很快速的創(chuàng)建 web 服務(wù),它的創(chuàng)建方式和 golang 極其的類似。
HttpHandler首先要實現(xiàn) HttpHandler, 重寫 handle 方法。
public class MyHandler implements HttpHandler { @Override public void handle(HttpExchange httpExchange) throws IOException { } }創(chuàng)建 web 服務(wù)
創(chuàng)建 web 服務(wù)并注冊前面創(chuàng)建的 handler,使用 handler 來處理請求。
public class Main { public static void main(String[] args) { try { HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0); server.createContext("/web", new MyHandler()); // 使用默認的 excutor server.setExecutor(null); server.start(); } catch (IOException e) { e.printStackTrace(); } }
只要運行這個 main 方法,一個 web 服務(wù)就啟動了,監(jiān)聽端口是 8000, 下面是我寫了兩個完整的例子。
GetHandlerpackage me.deweixu.handler; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import netscape.javascript.JSObject; import java.io.IOException; import java.io.OutputStream; import java.util.Map; /** * Created by simeone * * @author: simeone * @Date: 2018/5/19 */ public class GetHandler implements HttpHandler { @Override public void handle(HttpExchange httpExchange) throws IOException { System.out.println("Method: " + httpExchange.getRequestMethod()); String param = httpExchange.getRequestURI().getQuery(); System.out.println("Param:" + param); httpExchange.sendResponseHeaders(200, 0); OutputStream os = httpExchange.getResponseBody(); os.write(param.getBytes()); os.close(); } }PostHandler
package me.deweixu.handler; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; import java.io.UnsupportedEncodingException; /** * Created by simeone * * @author: simeone * @Date: 2018/5/19 */ public class PostHandler implements HttpHandler { @Override public void handle(HttpExchange httpExchange) throws IOException { System.out.println("Method: " + httpExchange.getRequestMethod()); InputStream is = httpExchange.getRequestBody(); String response = is2string(is); System.out.println("response: " + response); is.close(); httpExchange.sendResponseHeaders(200, response.length()); Headers headers = httpExchange.getResponseHeaders(); headers.set("Content-Type", "application/json; charset=utf8"); OutputStream os = httpExchange.getResponseBody(); os.write(response.getBytes()); os.close(); } private String is2string(InputStream is) throws IOException { final int bufferSize = 1024; final char[] buffer = new char[bufferSize]; final StringBuilder out = new StringBuilder(); Reader in = new InputStreamReader(is, "UTF-8"); for (; ; ) { int rsz = in.read(buffer, 0, buffer.length); if (rsz < 0) break; out.append(buffer, 0, rsz); } return out.toString(); } }Main
package me.deweixu; import com.sun.net.httpserver.HttpServer; import me.deweixu.handler.GetHandler; import me.deweixu.handler.PostHandler; import java.io.IOException; import java.net.InetSocketAddress; public class Main { public static void main(String[] args) { try { HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0); server.createContext("/post", new PostHandler()); server.createContext("/get", new GetHandler()); server.setExecutor(null); server.start(); } catch (IOException e) { e.printStackTrace(); } } }測試
# get $ curl http://127.0.0.1:8000/get?name=simeone&address=beijing name=simeone&address=beijing # post $ curl -H "Content-Type: application/json" -d "{"username":"simeone", "address":"beijing"}" http://127.0.0.1:8000/post {"username":"simeone", "address":"beijing"}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69429.html
摘要:指南無論你正在構(gòu)建什么,這些指南都旨在讓你盡快提高工作效率使用團隊推薦的最新項目版本和技術(shù)。使用進行消息傳遞了解如何將用作消息代理。安全架構(gòu)的主題指南,這些位如何組合以及它們?nèi)绾闻c交互。使用的主題指南以及如何為應(yīng)用程序創(chuàng)建容器鏡像。 Spring 指南 無論你正在構(gòu)建什么,這些指南都旨在讓你盡快提高工作效率 — 使用Spring團隊推薦的最新Spring項目版本和技術(shù)。 入門指南 這些...
摘要:前端和后端是計算機行業(yè)最常用的兩個術(shù)語在某種程度上,它們成了流行語。前端開發(fā)人員也稱為前端設(shè)計師,他們可以創(chuàng)建一個沒有任何后端開發(fā)的站點。 前端和后端是計算機行業(yè)最常用的兩個術(shù)語;在某種程度上,它們成了流行語。它們決定了你作為軟件開發(fā)人員的工作類型、你使用的技術(shù)以及你得到的報酬。那么,讓我們來談?wù)勥@兩個術(shù)語之間的區(qū)別,它們...
摘要:剛剛接觸這款神器,很多東西都在摸索中,對于像在及中創(chuàng)建動態(tài)工程那樣簡單的事在中也搞了好久,今天我就分享一下本菜鳥痛苦的學(xué)習(xí)過程,下面是我的總結(jié),希望對大家有一點幫助。遠程部署運行測試或到服務(wù)器上看一下 剛剛接觸IntelliJ IDEA這款神器,很多東西都在摸索中,對于像在eclipse及myeclipse中創(chuàng)建動態(tài)web工程那樣簡單的事在idea中也搞了好久,今天我就分享一下本菜鳥痛...
閱讀 2028·2021-11-23 10:03
閱讀 4432·2021-11-22 09:34
閱讀 2535·2021-10-08 10:05
閱讀 2275·2019-08-30 15:53
閱讀 1718·2019-08-30 13:56
閱讀 1185·2019-08-29 16:52
閱讀 1134·2019-08-26 13:31
閱讀 3370·2019-08-26 11:45