Apakah ada cara untuk membuat server HTTP yang sangat mendasar (hanya mendukung GET / POST) di Jawa hanya menggunakan Java SE API, tanpa menulis kode untuk mengurai permintaan HTTP secara manual dan memformat respons HTTP secara manual? Java SE API dengan baik merangkum fungsionalitas klien HTTP di HttpURLConnection, tetapi apakah ada analog untuk fungsionalitas server HTTP?
Untuk lebih jelasnya, masalah yang saya miliki dengan banyak contoh ServerSocket yang saya lihat online adalah bahwa mereka melakukan parsing / format respons permintaan sendiri dan penanganan kesalahan, yang membosankan, rawan kesalahan, dan tidak cenderung komprehensif, dan saya berusaha menghindarinya karena alasan itu.
Sebagai contoh manipulasi HTTP manual yang saya coba hindari:
http://java.sun.com/developer/technicalArticles/Networking/Webserver/WebServercode.html
sumber
Jawaban:
Sejak Java SE 6, ada server HTTP bawaan di
SunOracle JRE. Thecom.sun.net.httpserver
Ringkasan paket menguraikan kelas terlibat dan berisi contoh-contoh.Berikut ini adalah contoh kickoff yang di- copypasted dari dokumen mereka (untuk semua orang yang mencoba mengeditnya, karena ini adalah kode yang jelek, tolong jangan, ini adalah copy paste, bukan milikku, apalagi Anda tidak boleh mengedit kutipan kecuali mereka telah mengubah dalam sumber aslinya). Anda bisa menyalin 'n'paste'n'run di Java 6+.
Perlu dicatat bahwa
response.length()
bagian dalam contoh mereka buruk, seharusnyaresponse.getBytes().length
. Bahkan kemudian,getBytes()
metode harus secara eksplisit menentukan charset yang kemudian Anda tentukan di header respons. Sayangnya, meskipun sesat untuk pemula, itu semua hanya contoh awal kickoff.Jalankan dan buka http: // localhost: 8000 / test dan Anda akan melihat respons berikut:
Untuk menggunakan
com.sun.*
kelas, perlu dicatat bahwa ini bertentangan dengan apa yang dipikirkan beberapa pengembang, sama sekali tidak dilarang oleh FAQ yang terkenal. Mengapa Pengembang Tidak Harus Menulis Program yang Menyebut Paket 'sun' . FAQ itu menyangkutsun.*
paket (sepertisun.misc.BASE64Encoder
) untuk penggunaan internal oleh Oracle JRE (yang dengan demikian akan mematikan aplikasi Anda ketika Anda menjalankannya di JRE yang berbeda), bukancom.sun.*
paket. Sun / Oracle juga hanya mengembangkan perangkat lunak di atas Java SE API sendiri seperti setiap perusahaan lain seperti Apache dan sebagainya. Menggunakancom.sun.*
kelas hanya dianjurkan (tetapi tidak dilarang) ketika menyangkut implementasi API Java tertentu, seperti GlassFish (Java EE impl), Mojarra (JSF impl), Jersey (JAX-RS impl), dll.sumber
sun.*
dengancom.sun.*
. Misalnya, apakah Anda melihat dokumentasisun.*
API? Lihat di sini: java.sun.com/products/jdk/faq/faq-sun-packages.html Apakah ada artinyacom.sun.*
? Itucom.sun.*
hanya digunakan untuk perangkat lunak publik mereka sendiri yang bukan bagian dari Java API. Mereka juga mengembangkan perangkat lunak di atas Java API, seperti halnya setiap perusahaan lainnya.@jdk.Exported
dalam kode sumber OpenJDK yang berarti bahwa API dianggap publik dan akan tersedia di Java 9 (beberapacom.sun.*
paket lain akan menjadi tidak tersedia karena Project Jigsaw).Lihat NanoHttpd
"NanoHTTPD adalah server HTTP ringan yang dirancang untuk disematkan dalam aplikasi lain, dirilis di bawah lisensi BSD yang Dimodifikasi.
Ini sedang dikembangkan di Github dan menggunakan Apache Maven untuk pengujian unit & pengembangan "
sumber
GET /../../blahblah http/1.1
dikeluarkan dan server berjalan di atas root situs web dan masuk ke lahan file sistem, melayani file yang dapat digunakan untuk kompromi atau menyerang sistem dari jarak jauh, seperti file password.The com.sun.net.httpserver solusi adalah tidak portabel di JRE. Lebih baik menggunakan API layanan web resmi di javax.xml.ws untuk mem -bootstrap server HTTP minimal ...
EDIT: ini benar-benar berfungsi! Kode di atas terlihat seperti Groovy atau sesuatu. Berikut ini adalah terjemahan ke Jawa yang saya uji:
sumber
text/xml
.Saya suka pertanyaan ini karena ini adalah area di mana ada inovasi terus menerus dan selalu ada kebutuhan untuk memiliki server yang ringan terutama ketika berbicara tentang server yang tertanam dalam perangkat kecil (er). Saya pikir jawaban terbagi dalam dua kelompok besar.
Sementara saya mungkin mempertimbangkan perpustakaan HTTP seperti: Jetty , Apache Http Components , Netty dan lainnya lebih seperti fasilitas pemrosesan HTTP mentah. Pelabelan sangat subyektif, dan tergantung pada jenis hal yang Anda panggil untuk situs kecil. Saya membuat perbedaan ini dalam semangat pertanyaan, terutama komentar tentang ...
Alat mentah ini memungkinkan Anda melakukan itu (seperti yang dijelaskan dalam jawaban lain). Mereka tidak benar-benar memberikan gaya siap pakai untuk membuat server yang ringan, tertanam atau mini. Mini-server adalah sesuatu yang dapat memberi Anda fungsionalitas yang mirip dengan server web yang berfungsi penuh (seperti katakanlah, Tomcat ) tanpa bel dan peluit, volume rendah, kinerja yang baik 99% dari waktu. Thin-server tampaknya lebih dekat dengan ungkapan asli hanya sedikit lebih banyak daripada mentah mungkin dengan fungsi subset terbatas, cukup untuk membuat Anda terlihat baik 90% dari waktu. Gagasan saya tentang mentah akan membuat saya terlihat bagus 75% - 89% dari waktu tanpa desain dan coding tambahan. Saya pikir jika / ketika Anda mencapai tingkat file WAR, kami telah meninggalkan "kecil" untuk server bonsi yang terlihat seperti semua server besar tidak lebih kecil.
Opsi server-tipis
Opsi mini-server:
Di antara hal-hal lain yang perlu dipertimbangkan, saya akan menyertakan otentikasi, validasi, internasionalisasi, menggunakan sesuatu seperti FreeMaker atau alat template lain untuk membuat output halaman. Kalau tidak, mengelola pengeditan dan parameterisasi HTML kemungkinan akan membuat bekerja dengan HTTP terlihat seperti noughts-n-crosses. Secara alami itu semua tergantung pada seberapa fleksibel Anda perlu. Jika ini adalah mesin FAX yang digerakkan oleh menu, itu bisa sangat sederhana. Semakin banyak interaksi, semakin tebal kerangka kerja Anda. Pertanyaan bagus, semoga berhasil!
sumber
Lihatlah server web "Jetty" Jetty . Sepotong perangkat lunak Open Source yang luar biasa yang tampaknya memenuhi semua persyaratan Anda.
Jika Anda bersikeras untuk menggulirkan sendiri maka lihatlah kelas "httpMessage".
sumber
Sekali waktu saya sedang mencari sesuatu yang serupa - server HTTP ringan namun berfungsi penuh yang saya dapat dengan mudah menanamkan dan menyesuaikan. Saya menemukan dua jenis solusi potensial:
Jadi ... Saya mulai menulis JLHTTP - Java HTTP Server yang Ringan .
Anda dapat menanamkannya dalam proyek apa pun sebagai file sumber tunggal (jika agak panjang), atau sebagai stoples ~ 50K (~ 35K dilucuti) tanpa ketergantungan. Itu berusaha untuk menjadi RFC-compliant dan mencakup dokumentasi yang luas dan banyak fitur berguna sambil menjaga mengasapi ke minimum.
Fitur termasuk: host virtual, penyajian file dari disk, pemetaan tipe mime melalui file mime.types standar, pembuatan indeks direktori, file sambutan, dukungan untuk semua metode HTTP, ETag bersyarat dan dukungan header If- *, penyandian transfer chunked, gzip / deflate kompresi, HTTPS dasar (seperti yang disediakan oleh JVM), konten parsial (kelanjutan unduhan), penanganan multi-bagian / formulir-data untuk unggahan file, penangan konteks berganda melalui API atau anotasi, penguraian parameter (string kueri atau x-www-form-urlencoded) tubuh), dll.
Saya harap orang lain merasakan manfaatnya :-)
sumber
Server web yang sangat mendasar yang ditulis dalam java dapat ditemukan di sini http://library.sourcerabbit.com/v/?id=19
sumber
Spark adalah yang paling sederhana, berikut ini panduan mulai cepat: http://sparkjava.com/
sumber
Dimungkinkan untuk membuat httpserver yang menyediakan dukungan dasar untuk servlet J2EE hanya dengan JDK dan api servlet hanya dalam beberapa baris kode.
Saya telah menemukan ini sangat berguna untuk servlets unit testing, karena mulai jauh lebih cepat daripada wadah ringan lainnya (kami menggunakan dermaga untuk produksi).
Httpserver yang paling ringan tidak memberikan dukungan untuk servlet, tetapi kami membutuhkannya, jadi saya pikir saya akan membagikannya.
Contoh di bawah ini memberikan dukungan servlet dasar, atau melempar dan UnsupportedOperationException untuk hal-hal yang belum diimplementasikan. Ia menggunakan com.sun.net.httpserver.HttpServer untuk dukungan http dasar.
sumber
Saya sangat merekomendasikan melihat ke dalam Simple , terutama jika Anda tidak memerlukan kemampuan Servlet tetapi hanya akses ke objek permintaan / tanggapan. Jika Anda memerlukan REST, Anda dapat menempatkan Jersey di atasnya, jika Anda perlu menampilkan HTML atau yang serupa ada Freemarker. Saya benar-benar menyukai apa yang dapat Anda lakukan dengan kombinasi ini, dan ada relatif sedikit API untuk dipelajari.
sumber
Kode ini lebih baik dari kita, Anda hanya perlu menambahkan 2 lib : javax.servelet.jar dan org.mortbay.jetty.jar .
Dermaga Kelas:
Kelas Servlet:
sumber
*.Servlet.jar
dan*.jetty.jar
jelas bukan bagian dari Java SE.Anda juga dapat melihat beberapa kerangka kerja aplikasi NIO seperti:
sumber
Semua jawaban di atas merinci tentang Handler Permintaan Utama berulir tunggal.
pengaturan:
Mengizinkan beberapa permintaan ditayangkan melalui beberapa utas menggunakan layanan pelaksana.
Jadi kode akhirnya akan seperti di bawah ini:
sumber
checkout Sederhana . ini adalah server embeddable yang cukup sederhana dengan dukungan bawaan untuk beragam operasi. Saya sangat suka model threading-nya ..
Luar biasa!
sumber
Lihat
takes
. Lihatlah https://github.com/yegor256/takes untuk info cepatsumber
Bagaimana dengan proyek Apache Commons HttpCore ?
Dari situs web: ... HttpCore Goals
sumber
Coba ini https://github.com/devashish234073/Java-Socket-Http-Server/blob/master/README.md
API ini telah membuat server HTTP menggunakan soket.
Sebagai contoh, inilah cara konstruktor di
Response.java
kelas mengubah respons mentah menjadi respons http:sumber
Anda dapat menulis server Jetty Java tertanam yang cukup sederhana .
Embedded Jetty berarti bahwa server (Jetty) dikirimkan bersama dengan aplikasi sebagai lawan dari penerapan aplikasi pada server Jetty eksternal.
Jadi jika dalam pendekatan non-embedded webapp Anda dibangun ke dalam file WAR yang digunakan untuk beberapa server eksternal ( Tomcat / Jetty / etc), di Jetty tertanam, Anda menulis webapp dan instantiate server dermaga di basis kode yang sama.
Contoh untuk server Jetty Java tertanam, Anda dapat menggunakan clone dan menggunakan: https://github.com/stas-slu/embedded-jetty-java-server-example
sumber