HTTP リクエストを手動で解析し、HTTP 応答を手動でフォーマットするコードを記述せずに、Java SE API だけを使用して Java で非常に基本的な HTTP サーバー (GET/POST のみをサポート) を作成する方法はありますか? Java SE API は HTTP クライアント機能を にうまくカプセル化していますHttpURLConnection
が、HTTP サーバー機能に相当するものはありますか?
明確にしておくと、私がオンラインで見た多くの例で問題ServerSocket
なのは、独自のリクエスト解析/応答フォーマットとエラー処理を行っていることです。これは面倒で、エラーが発生しやすく、包括的ではない可能性が高いため、私はこれらの理由からそれを避けようとしています。
ベストアンサー1
Java SE 6以降、 Sun
Oracle JREにはHTTPサーバーが組み込まれています 。Java 9のモジュール名はjdk.httpserver
。com.sun.net.httpserver
パッケージの概要関連するクラスの概要と例を示します。
彼らのドキュメントからコピーペーストしたキックオフの例を次に示します。Java 6+ でコピー&ペーストして実行できます。
(それでもなお編集しようとしているすべての人へ。これは醜いコードなので、やめてください。これはコピーペーストであり、私のものではありません。また、元のソースで変更されていない限り、引用を編集しないでください)
package com.stackoverflow.q3732109; import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; public class Test { public static void main(String[] args) throws Exception { HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0); server.createContext("/test", new MyHandler()); server.setExecutor(null); // creates a default executor server.start(); } static class MyHandler implements HttpHandler { @Override public void handle(HttpExchange t) throws IOException { String response = "This is the response"; t.sendResponseHeaders(200, response.length()); OutputStream os = t.getResponseBody(); os.write(response.getBytes()); os.close(); } } }
注目すべきは、response.length()
彼らの例の の部分が間違っているということです。 であるべきでしたresponse.getBytes().length
。 それでも、getBytes()
メソッドは明示的に文字セットを指定する必要があります。その後、それを応答ヘッダーで指定します。 残念ながら、初心者には誤解を招くかもしれませんが、結局のところ、これは基本的なキックオフ例にすぎません。
これを実行して http://localhost:8000/test にアクセスすると、次の応答が表示されます。
これがその答えだ
クラスの使用に関してはcom.sun.*
、一部の開発者が考えているのとは反対に、よく知られているFAQでは絶対に禁止されていないことに注意してください。開発者が「sun」パッケージを呼び出すプログラムを書いてはいけない理由その FAQ は、パッケージではなく、Oracle JRE による内部使用のためのsun.*
パッケージ (など) に関するものです (そのため、別の JRE でアプリケーションを実行すると、アプリケーションが強制終了されます) 。Sun/Oracle も、Apache などの他の企業と同様に、Java SE API 上でソフトウェアを開発しています。さらに、この特定のパッケージはすべての JDK に存在する必要があるため、パッケージで発生するような「移植性」の問題はまったく発生しません。クラスの使用は、GlassFish (Java EE 実装)、Mojarra (JSF 実装)、Jersey (JAX-RS 実装) などの特定の Java API の実装に関する場合にのみ推奨されません (ただし、禁止されていません)。sun.misc.BASE64Encoder
com.sun.*
HttpServer
sun.*
com.sun.*