摘要:今天我瞎翻的源代碼,發(fā)現(xiàn)可以用包下提供的很快速的創(chuàng)建服務(wù),它的創(chuàng)建方式和極其的類似。創(chuàng)建服務(wù)創(chuàng)建服務(wù)并注冊(cè)前面創(chuàng)建的,使用來處理請(qǐng)求。使用默認(rèn)的只要運(yùn)行這個(gè)方法,一個(gè)服務(wù)就啟動(dòng)了,監(jiān)聽端口是,下面是我寫了兩個(gè)完整的例子。
我最開始學(xué)習(xí) Java web 編程是要去寫一個(gè) servlet, 重寫里面的 service 方法,然后去配置 web.xml 文件,最后就是部署到 tomcat 或者 jetty 容器中并啟動(dòng)。后來就是使用一些框架,struts2 SpringMvc。今天我瞎翻 JDK 的源代碼,發(fā)現(xiàn)可以用 com.sun.net.httpserver 包下提供的 API 很快速的創(chuàng)建 web 服務(wù),它的創(chuàng)建方式和 golang 極其的類似。
HttpHandler首先要實(shí)現(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ù)并注冊(cè)前面創(chuàng)建的 handler,使用 handler 來處理請(qǐng)求。
public class Main { public static void main(String[] args) { try { HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0); server.createContext("/web", new MyHandler()); // 使用默認(rèn)的 excutor server.setExecutor(null); server.start(); } catch (IOException e) { e.printStackTrace(); } }
只要運(yùn)行這個(gè) main 方法,一個(gè) web 服務(wù)就啟動(dòng)了,監(jiān)聽端口是 8000, 下面是我寫了兩個(gè)完整的例子。
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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/69429.html
摘要:指南無論你正在構(gòu)建什么,這些指南都旨在讓你盡快提高工作效率使用團(tuán)隊(duì)推薦的最新項(xiàng)目版本和技術(shù)。使用進(jìn)行消息傳遞了解如何將用作消息代理。安全架構(gòu)的主題指南,這些位如何組合以及它們?nèi)绾闻c交互。使用的主題指南以及如何為應(yīng)用程序創(chuàng)建容器鏡像。 Spring 指南 無論你正在構(gòu)建什么,這些指南都旨在讓你盡快提高工作效率 — 使用Spring團(tuán)隊(duì)推薦的最新Spring項(xiàng)目版本和技術(shù)。 入門指南 這些...
摘要:前端和后端是計(jì)算機(jī)行業(yè)最常用的兩個(gè)術(shù)語在某種程度上,它們成了流行語。前端開發(fā)人員也稱為前端設(shè)計(jì)師,他們可以創(chuàng)建一個(gè)沒有任何后端開發(fā)的站點(diǎn)。 前端和后端是計(jì)算機(jī)行業(yè)最常用的兩個(gè)術(shù)語;在某種程度上,它們成了流行語。它們決定了你作為軟件開發(fā)人員的工作類型、你使用的技術(shù)以及你得到的報(bào)酬。那么,讓我們來談?wù)勥@兩個(gè)術(shù)語之間的區(qū)別,它們...
摘要:剛剛接觸這款神器,很多東西都在摸索中,對(duì)于像在及中創(chuàng)建動(dòng)態(tài)工程那樣簡單的事在中也搞了好久,今天我就分享一下本菜鳥痛苦的學(xué)習(xí)過程,下面是我的總結(jié),希望對(duì)大家有一點(diǎn)幫助。遠(yuǎn)程部署運(yùn)行測試或到服務(wù)器上看一下 剛剛接觸IntelliJ IDEA這款神器,很多東西都在摸索中,對(duì)于像在eclipse及myeclipse中創(chuàng)建動(dòng)態(tài)web工程那樣簡單的事在idea中也搞了好久,今天我就分享一下本菜鳥痛...
閱讀 1979·2021-11-23 10:03
閱讀 4162·2021-11-22 09:34
閱讀 2479·2021-10-08 10:05
閱讀 2252·2019-08-30 15:53
閱讀 1689·2019-08-30 13:56
閱讀 1159·2019-08-29 16:52
閱讀 1109·2019-08-26 13:31
閱讀 3351·2019-08-26 11:45