シナリオは以下のとおりです。サーバーでリクエストを受け取り、処理を行ってから、処理に基づいて別のサーバーにリクエストを送信し、リモートサーバーから取得したものに基づいて応答を作成する必要があります。これはJAVAPlayframework2.0で行われる予定であり、リモートサーバーからの要求の送信と応答の取得の一部が欠落しています。どんな助けでもいただければ幸いです。ありがとう :)
2 に答える
準備
まず、少なくともURLとを知る必要がありますcharset
。パラメータはオプションであり、機能要件によって異なります。
String url = "http://example.com";
String charset = "UTF-8";
String param1 = "value1";
String param2 = "value2";
// ...
String query = String.format("param1=%s¶m2=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(param2, charset));
クエリパラメータはname=value形式で、&で連結する必要があります。charset
通常は、を使用して指定されたクエリパラメータをURLエンコードしますURLEncoder#encode()
。
String#format()は便宜上のものです。文字列連結演算子+が2回以上必要な場合に適しています。
(オプションで)クエリパラメータを使用してHTTPGETリクエストを実行します。
それは簡単な作業です。これがデフォルトのリクエストメソッドです。
URLConnection connection = new URL(url + "?" + query).openConnection();
connection.setRequestProperty("Accept-Charset", charset);
InputStream response = connection.getInputStream();
// ...
クエリ文字列は、?を使用してURLに連結する必要があります。Accept-Charset
ヘッダーは、パラメーターがどのエンコードに含まれているかをサーバーに示唆する場合があります。クエリ文字列を送信しない場合は、ヘッダーを省略できますAccept-Charset
。ヘッダーを設定する必要がない場合は、URL#openStream()
ショートカットメソッドを使用することもできます。
InputStream response = new URL(url).openStream();
// ...
いずれにせよ、反対側がである場合HttpServlet
、そのdoGet()
メソッドが呼び出され、パラメータは。によって利用可能になりますHttpServletRequest#getParameter()
。クエリパラメータを使用してHTTPPOSTリクエストを実行します。
クエリパラメータを使用してHTTPPOSTリクエストを実行します。
をtrueに設定するURLConnection#setDoOutput()
と、要求メソッドが暗黙的にPOSTに設定されます。webfromsが行う標準のHTTPPOSTはapplication/x-www-form-urlencoded
、クエリ文字列がリクエスト本文に書き込まれるタイプです。
URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true); // Triggers POST.
connection.setRequestProperty("Accept-Charset", charset);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
OutputStream output = null;
try {
output = connection.getOutputStream();
output.write(query.getBytes(charset));
} finally {
if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
}
InputStream response = connection.getInputStream();
// ...
注:プログラムでHTMLフォームを送信する場合は、要素のname = valueペアをクエリ文字列に含めることを忘れないでください。もちろん、必要な要素のname=valueペアも含めることを忘れないでください。プログラムで「押す」(これは通常、サーバー側でボタンが押されたかどうか、押された場合はどれが押されたかを区別するために使用されるため)。
得られたものをにキャストして、代わりに使用することもURLConnection
できますHttpURLConnection
。HttpURLConnection#setRequestMethod()
ただし、出力に接続を使用しようとしている場合でもURLConnection
#setDoOutput()
、trueに設定する必要があります。
HttpURLConnection httpConnection = (HttpURLConnection) new URL(url).openConnection();
httpConnection.setRequestMethod("POST");
// ...
いずれにせよ、反対側がである場合HttpServlet
、そのdoPost()
メソッドが呼び出され、パラメータは。によって利用可能になりますHttpServletRequest#getParameter()
。
ちなみに、次の質問からのほぼコピーペースト
Playサーバーからリクエストを呼び出すには、WSAPIを使用する必要があります。使い方は簡単で、非同期でリモート呼び出しを行うこともできます。
public static Result feedTitle(String feedUrl) {
return async(
WS.url(feedUrl).get().map(
new Function<WS.Response, Result>() {
public Result apply(WS.Response response) {
return ok("Feed title:" + response.asJson().findPath("title"));
}
}
)
);
}
Playドキュメントの詳細情報。