Czy istnieje sposób na stworzenie bardzo podstawowego serwera HTTP (obsługującego tylko GET / POST) w Javie przy użyciu tylko API Java SE, bez pisania kodu do ręcznej analizy żądań HTTP i ręcznego formatowania odpowiedzi HTTP? Interfejs API Java SE ładnie zawiera funkcjonalność klienta HTTP w HttpURLConnection, ale czy istnieje analogia do funkcjonalności serwera HTTP?
Dla jasności, problem, który mam z wieloma przykładami ServerSocket, które widziałem online, polega na tym, że same analizują żądania / formatują odpowiedzi i obsługują błędy, co jest żmudne, podatne na błędy i mało prawdopodobne, aby było wyczerpujące, i staram się tego unikać z tych powodów.
Jako przykład ręcznej manipulacji HTTP, której próbuję uniknąć:
http://java.sun.com/developer/technicalArticles/Networking/Webserver/WebServercode.html
źródło
Odpowiedzi:
Od wersji Java SE 6 w
SunOracle JRE jest wbudowany serwer HTTP .com.sun.net.httpserver
Zbiorczym przedstawia zaangażowane klasy i zawiera przykłady.Oto przykładowy początek skopiowany z ich dokumentów (dla wszystkich osób, które próbują go edytować, ponieważ jest to brzydki fragment kodu, proszę nie, to jest wklejanie kopii, a nie moje, ponadto nie należy nigdy edytować cytatów, chyba że uległy zmianie w oryginalnym źródle). Możesz po prostu skopiować i wkleić go w Javie 6+.
Należy zauważyć, że
response.length()
część w ich przykładzie jest zła, powinna byćresponse.getBytes().length
. Nawet wtedygetBytes()
metoda musi jawnie określać zestaw znaków, który następnie określa się w nagłówku odpowiedzi. Niestety, choć mylące dla początkujących, jest to po prostu podstawowy przykład rozpoczęcia.Wykonaj go i przejdź do http: // localhost: 8000 / test, a zobaczysz następującą odpowiedź:
Jeśli chodzi o korzystanie z
com.sun.*
klas, zauważ, że jest to, w przeciwieństwie do tego, co myślą niektórzy programiści, absolutnie nie zabronione przez dobrze znane FAQ Dlaczego programiści nie powinni pisać programów, które nazywają pakiety „słoneczne” . Często zadawane pytania dotycząsun.*
pakietu (np.sun.misc.BASE64Encoder
) Do użytku wewnętrznego przez Oracle JRE (który zabiłby twoją aplikację, gdy uruchomisz go na innym JRE), a niecom.sun.*
pakietu. Sun / Oracle opracowuje również oprogramowanie oparte na samym interfejsie API Java SE, tak jak każda inna firma, taka jak Apache i tak dalej. Używaniecom.sun.*
klas jest odradzane (ale nie zabronione) tylko wtedy, gdy dotyczy implementacji niektórych API Java, takich jak GlassFish (Java EE impl), Mojarra (JSF impl), Jersey (JAX-RS impl itp.)źródło
sun.*
zcom.sun.*
. Czy na przykład widzisz dokumentacjęsun.*
API? Zajrzyj tutaj: java.sun.com/products/jdk/faq/faq-sun-packages.html Czy coś o tym mówicom.sun.*
?com.sun.*
Jest po prostu wykorzystywane do własnego oprogramowania publicznej, która nie jest częścią Java API. Tworzą także oprogramowanie na bazie Java API, jak każda inna firma.@jdk.Exported
w kodzie źródłowym OpenJDK, co oznacza, że API jest uważane za publiczne i będzie dostępne w Javie 9 (niektóre innecom.sun.*
pakiety staną się niedostępne z powodu Project Jigsaw).Sprawdź NanoHttpd
„NanoHTTPD to lekki serwer HTTP zaprojektowany do osadzania w innych aplikacjach, wydany na zmodyfikowanej licencji BSD.
Jest rozwijany w Github i używa Apache Maven do kompilacji i testów jednostkowych ”
źródło
GET /../../blahblah http/1.1
jest wysyłane, a serwer przechodzi nad katalogiem głównym witryny do lądowania plików systemowych, udostępniając pliki, których można użyć do złamania lub zdalnego ataku na system, np. Plik hasła.Rozwiązanie com.sun.net.httpserver nie jest przenośne w środowisku JRE. Lepiej jest użyć oficjalnego interfejsu API usług internetowych w pliku javax.xml.ws, aby załadować minimalny serwer HTTP ...
EDYCJA: to faktycznie działa! Powyższy kod wygląda jak Groovy lub coś takiego. Oto tłumaczenie na Javę, które przetestowałem:
źródło
text/xml
.Podoba mi się to pytanie, ponieważ jest to obszar, w którym nieustannie wprowadzane są innowacje i zawsze trzeba mieć lekki serwer, zwłaszcza gdy mówimy o serwerach wbudowanych w małe (er) urządzenia. Myślę, że odpowiedzi dzielą się na dwie szerokie grupy.
Chociaż mogę uznać biblioteki HTTP, takie jak: Jetty , Apache Http Components , Netty i inne, bardziej przypominające surowe funkcje przetwarzania HTTP. Etykietowanie jest bardzo subiektywne i zależy od rodzaju rzeczy, do których dostarczenia wezwano małe witryny. Rozróżniam to w duchu pytania, szczególnie uwagi o ...
Te surowe narzędzia pozwalają ci to zrobić (jak opisano w innych odpowiedziach). Tak naprawdę nie nadają się do gotowego stylu tworzenia lekkiego, wbudowanego lub mini-serwera. Mini-serwer jest czymś, co może dać ci podobną funkcjonalność jak w pełni funkcjonalny serwer internetowy (np. Tomcat ) bez dzwonków i gwizdków, niski poziom głośności, dobra wydajność w 99% przypadków. Cienki serwer wydaje się być bliższy pierwotnemu sformułowaniu, nieco bardziej niż surowy, być może z ograniczoną funkcjonalnością podzbioru, co wystarczy, aby wyglądać dobrze przez 90% czasu. Mój pomysł na raw sprawiłby, że wyglądam dobrze 75% - 89% czasu bez dodatkowego projektowania i kodowania. Myślę, że jeśli / kiedy osiągniesz poziom plików WAR, pozostawiliśmy „małe” dla serwerów bonsi, które wyglądają jak wszystko, co duży serwer robi mniejsze.
Opcje cienkiego serwera
Opcje mini-serwera:
Pomiędzy innymi rzeczami do rozważenia, obejmowałbym uwierzytelnianie, sprawdzanie poprawności, internacjonalizację, używanie czegoś takiego jak FreeMaker lub inne narzędzie do szablonów do renderowania danych wyjściowych strony. W przeciwnym razie zarządzanie edycją HTML i parametryzacją może sprawić, że praca z HTTP będzie wyglądać jak krzyżyk noughts-n-crosses. Oczywiście wszystko zależy od tego, jak elastyczna musisz być. Jeśli jest to urządzenie FAKS z menu, może być bardzo proste. Im więcej interakcji, tym „ grubszy ” musi być twój framework. Dobre pytanie, powodzenia!
źródło
Zajrzyj na serwer Jetty Jetty . Znakomity kawałek oprogramowania Open Source, które wydaje się spełniać wszystkie Twoje wymagania.
Jeśli nalegasz, aby rozwinąć własną, spójrz na klasę „httpMessage”.
źródło
Dawno, dawno temu szukałem czegoś podobnego - lekkiego, ale w pełni funkcjonalnego serwera HTTP, który mogłem łatwo osadzić i dostosować. Znalazłem dwa rodzaje potencjalnych rozwiązań:
Więc ... postanowiłem napisać JLHTTP - Java Lightweight HTTP Server .
Możesz osadzić go w dowolnym projekcie jako pojedynczy (jeśli raczej długi) plik źródłowy lub jako słoik o ~ 50 KB (okrojony o ~ 35 KB) bez żadnych zależności. Stara się być zgodny z RFC i zawiera obszerną dokumentację oraz wiele przydatnych funkcji, jednocześnie zmniejszając wzdęcia do minimum.
Funkcje obejmują: wirtualne hosty, serwery plików z dysku, mapowania typów MIME poprzez standardowy plik mime.types, generowanie indeksu katalogów, pliki powitalne, wsparcie dla wszystkich metod HTTP, warunkowe ETag i obsługa nagłówka If- *, kodowanie przesyłania porcjami, gzip / deflate kompresja, podstawowy HTTPS (dostarczony przez JVM), częściowa zawartość (kontynuacja pobierania), obsługa danych wieloczęściowych / formularzy do przesyłania plików, obsługa wielu kontekstów za pośrednictwem interfejsu API lub adnotacji, analiza parametrów (ciąg zapytania lub x-www-form-urlencoded ciało) itp.
Mam nadzieję, że inni uznają to za przydatne :-)
źródło
Bardzo prosty serwer WWW napisany w języku Java można znaleźć tutaj http://library.sourcerabbit.com/v/?id=19
źródło
Spark jest najprostszy, oto krótki przewodnik: http://sparkjava.com/
źródło
Możliwe jest utworzenie serwera http, który zapewnia podstawową obsługę serwletów J2EE za pomocą JDK i apletu apletu w zaledwie kilku wierszach kodu.
Uważam, że jest to bardzo przydatne do serwletów testujących jednostki, ponieważ zaczyna się znacznie szybciej niż inne lekkie pojemniki (używamy pomostów do produkcji).
Większość bardzo lekkich serwerów HTTP nie zapewnia wsparcia dla serwletów, ale potrzebujemy ich, więc pomyślałem, że podzielę się nimi.
Poniższy przykład przedstawia podstawową obsługę serwletów lub wyjątki UnsupportedOperationException dla rzeczy, które nie zostały jeszcze zaimplementowane. Wykorzystuje com.sun.net.httpserver.HttpServer do podstawowej obsługi HTTP.
źródło
Mogę zdecydowanie polecić przyjrzenie się Simple , szczególnie jeśli nie potrzebujesz możliwości serwletu, ale po prostu masz dostęp do obiektów żądania / odpowiedzi. Jeśli potrzebujesz REST, możesz umieścić na nim Jersey, jeśli chcesz wyprowadzić HTML lub podobny, jest Freemarker. Naprawdę uwielbiam to, co możesz zrobić z tą kombinacją, i jest stosunkowo mało API do nauczenia się.
źródło
Ten kod jest lepszy niż nasz, wystarczy dodać tylko 2 biblioteki: javax.servelet.jar i org.mortbay.jetty.jar .
Molo klasowe:
Klasa serwletu:
źródło
*.Servlet.jar
i*.jetty.jar
oczywiście nie są częścią Java SE.Możesz także zapoznać się z niektórymi ramami aplikacji NIO, takimi jak:
źródło
Wszystkie powyższe odpowiedzi zawierają szczegółowe informacje na temat pojedynczego głównego wątkowego modułu obsługi zapytań.
oprawa:
Umożliwia obsługę wielu żądań przez wiele wątków przy użyciu usługi modułu wykonującego.
Więc kod końcowy będzie taki jak poniżej:
źródło
kasa Prosta . jest to dość prosty serwer, który można osadzić, z wbudowaną obsługą wielu różnych operacji. Szczególnie podoba mi się jego model wątków
Niesamowity!
źródło
Sprawdź
takes
. Spójrz na https://github.com/yegor256/takes, aby uzyskać szybkie informacjeźródło
Co powiesz na projekt Apache Commons HttpCore ?
Ze strony internetowej: ... HttpCore Goals
źródło
Spróbuj tego https://github.com/devashish234073/Java-Socket-Http-Server/blob/master/README.md
Ten interfejs API tworzy serwer HTTP za pomocą gniazd.
Na przykład oto, w jaki sposób konstruktor w
Response.java
klasie przekształca surową odpowiedź w odpowiedź http:źródło
Możesz napisać całkiem prosty wbudowany serwer Jetty Java.
Wbudowane Jetty oznacza, że serwer (Jetty) jest dostarczany razem z aplikacją, w przeciwieństwie do wdrażania aplikacji na zewnętrznym serwerze Jetty.
Więc jeśli w podejściu niewbudowanym twoja aplikacja internetowa wbudowana w plik WAR, który został wdrożony na jakimś zewnętrznym serwerze ( Tomcat / Jetty / etc), we wbudowanym Jetty, piszesz aplikację internetową i tworzysz instancję serwera molo w tej samej bazie kodu.
Przykład wbudowanego serwera Jetty Java, który można klonować i użyć: https://github.com/stas-slu/embedded-jetty-java-server-example
źródło