質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

2回答

2892閲覧

JavaでHTTPリクエスト(POST)を非同期で送信する

Negima1072

総合スコア0

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

1クリップ

投稿2021/01/20 12:11

編集2021/01/20 12:22

前提

JavaFxを用いてアプリケーションを制作しています。
その際、非同期でWebAPIにリクエストを送り結果を受け取る関数を実装したいのですが、やり方が分からず有用なドキュメントも見つけることができなかったため伝授していただければと思います。

###実現したいこと
非同期でWebAPIサーバーにParamsをPOST送信し、レスポンスを取得する。

該当のソースコード

Java

1private String doPost(String url, List<NameValuePair> params){ 2 CloseableHttpClient client = HttpClients.createDefault(); 3 HttpContext httpContext = new BasicHttpContext(); 4 httpContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore); 5 String res = ""; 6 Charset charset = StandardCharsets.UTF_8; 7 HttpPost request = new HttpPost(URI.create(url)); 8 CloseableHttpResponse response = null; 9 try{ 10 request.setEntity(new UrlEncodedFormEntity(params)); 11 response = client.execute(request, httpContext); 12 int status = response.getCode(); 13 if(status == HttpStatus.SC_SUCCESS){ 14 res = EntityUtils.toString(response.getEntity(),charset); 15 } 16 } catch (IOException | ParseException e) { 17 e.printStackTrace(); 18 }finally { 19 try { 20 if (response != null) { 21 response.close(); 22 } 23 if (client != null) { 24 client.close(); 25 } 26 }catch (IOException e) { 27 e.printStackTrace(); 28 } 29 } 30 return res; 31 } 32 33private String doPostAsyns(String url, List<NameValuePair> params){ 34 CloseableHttpAsyncClient client = HttpAsyncClients.createDefault(); 35 client.start(); 36 SimpleHttpRequest request = SimpleHttpRequests.post(url); 37 HttpContext context = new BasicHttpContext(); 38 context.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore); 39 request.setEntity(new UrlEncodedFormEntity(params)); #ここ 40 final String[] response = {""}; 41 client.execute(request, context, new FutureCallback<SimpleHttpResponse>() { 42 @Override 43 public void completed(SimpleHttpResponse simpleHttpResponse) { 44 response[0] = simpleHttpResponse.getBodyText(); 45 } 46 @Override 47 public void failed(Exception e) { 48 response[0] = ""; 49 } 50 @Override 51 public void cancelled() { 52 response[0] = ""; 53 } 54 }); 55 return response[0]; 56 }

試したこと

上記のソースコードのようにJavaApacheHTTPClientを使用してdoPostを実装しこれは使用することができました。(ただし使用中はフリーズする。)
doPostを参考にしdoPostAsynsを実装してみましたがSimpleHttpRequestにsetEntityがなくparamsデータを設定できない状況です。

補足情報(FW/ツールのバージョンなど)

Windows10 最新版
Java SE 11
JavaFx 11.0.2
Apache HTTPClient 5.0.3

###補足
使用するHTTPClientのライブラリはApache以外のものでも構いません。使いやすいものがあれば紹介していただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

質問者さんがご提示のコードで試されている Apacheの HttpClient 5.0 ですが、その非同期版であれば、HttpAsyncClient 4.1 になるかと思います。

その説明ページ HttpAsyncClient Quick StartにGETメソッドでのサンプルコードがあります。これをもとにPOSTメソッドでフォームパラメータを扱うコードを作成し、試してみましたのでご参考までに以下に示します。

JavaFXでは試せてはいませんが、イベントハンドラーにうまく適用することで使うことができると思います。

Java

1import java.util.ArrayList; 2import java.io.IOException; 3import java.nio.CharBuffer; 4import java.util.concurrent.Future; 5import java.util.concurrent.CountDownLatch; 6import java.util.concurrent.ExecutionException; 7 8import org.apache.http.nio.IOControl; 9import org.apache.http.nio.client.*; 10import org.apache.http.nio.client.methods.HttpAsyncMethods; 11import org.apache.http.nio.client.methods.AsyncCharConsumer; 12import org.apache.http.nio.protocol.HttpAsyncRequestProducer; 13import org.apache.http.protocol.HttpContext; 14import org.apache.http.impl.nio.client.HttpAsyncClients; 15import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; 16import org.apache.http.client.methods.HttpPost; 17import org.apache.http.client.entity.UrlEncodedFormEntity; 18import org.apache.http.HttpResponse; 19import org.apache.http.NameValuePair; 20import org.apache.http.message.BasicNameValuePair; 21import org.apache.http.concurrent.FutureCallback; 22 23public class HttpPostSample { 24 25 public static void main(String[] args) { 26 String url = "http://localhost:8000/cgi-bin/t1.py"; 27 if (args.length > 0) { 28 url = args[0]; 29 } 30 31 try { 32 run(url); 33 } catch (Exception ex) { 34 System.out.println("Exception: *****"); 35 ex.printStackTrace(); 36 } 37 } 38 39 private static void run(String url) 40 throws IOException, InterruptedException, ExecutionException { 41 42 CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault(); 43 try { 44 // Start the client 45 httpclient.start(); 46 47 // Execute request 48 final HttpPost request1 = new HttpPost(url); 49 ArrayList<NameValuePair> parms1; 50 parms1 = new ArrayList<NameValuePair>(); 51 parms1.add(new BasicNameValuePair("p11", "v11")); 52 parms1.add(new BasicNameValuePair("p12", "v12")); 53 request1.setEntity(new UrlEncodedFormEntity(parms1, "UTF-8")); 54 55 System.out.println("#1 started..."); 56 Future<HttpResponse> future = httpclient.execute(request1, null); 57 // and wait until a response is received 58 HttpResponse response1 = future.get(); 59 System.out.println(request1.getRequestLine() + "->" + response1.getStatusLine()); 60 System.out.println("#1 done."); 61 62 // Execute request 63 // One most likely would want to use a callback for operation result 64 final CountDownLatch latch1 = new CountDownLatch(1); 65 final HttpPost request2 = new HttpPost(url); 66 67 ArrayList<NameValuePair> params2; 68 params2 = new ArrayList<NameValuePair>(); 69 params2.add(new BasicNameValuePair("p21", "v21")); 70 params2.add(new BasicNameValuePair("p22", "v22")); 71 request2.setEntity(new UrlEncodedFormEntity(params2, "UTF-8")); 72 73 System.out.println("#2 started..."); 74 httpclient.execute(request2, new FutureCallback<HttpResponse>() { 75 76 public void completed(final HttpResponse response2) { 77 latch1.countDown(); 78 System.out.println("completed: " + request2.getRequestLine() + "->" + response2.getStatusLine()); 79 } 80 81 public void failed(final Exception ex) { 82 latch1.countDown(); 83 System.out.println("failed: " + request2.getRequestLine() + "->" + ex); 84 } 85 86 public void cancelled() { 87 latch1.countDown(); 88 System.out.println("cancelled: " + request2.getRequestLine() + " cancelled"); 89 } 90 }); 91 System.out.println("#2 await..."); 92 latch1.await(); 93 System.out.println("#2 done."); 94 95 // In real world one most likely would also want to stream 96 // request and response body content 97 final CountDownLatch latch2 = new CountDownLatch(1); 98 final HttpPost request3 = new HttpPost(url); 99 ArrayList<NameValuePair> params3; 100 params3 = new ArrayList<NameValuePair>(); 101 params3.add(new BasicNameValuePair("p31", "v31")); 102 params3.add(new BasicNameValuePair("p32", "v32")); 103 request3.setEntity(new UrlEncodedFormEntity(params3, "UTF-8")); 104 HttpAsyncRequestProducer producer3 = HttpAsyncMethods.create(request3); 105 AsyncCharConsumer<HttpResponse> consumer3 = new AsyncCharConsumer<HttpResponse>() { 106 107 HttpResponse response; 108 109 @Override 110 protected void onResponseReceived(final HttpResponse response) { 111 this.response = response; 112 System.out.println("onResponseReceived:"); 113 } 114 115 @Override 116 protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException { 117 // Do something useful 118 System.out.println("onCharReceived:"); 119 } 120 121 @Override 122 protected void releaseResources() { 123 System.out.println("releaseResources:"); 124 } 125 126 @Override 127 protected HttpResponse buildResult(final HttpContext context) { 128 System.out.println("buildResult:"); 129 return this.response; 130 } 131 }; 132 133 System.out.println("#3 started..."); 134 httpclient.execute(producer3, consumer3, new FutureCallback<HttpResponse>() { 135 136 public void completed(final HttpResponse response3) { 137 latch2.countDown(); 138 System.out.println(request3.getRequestLine() + "->" + response3.getStatusLine()); 139 } 140 141 public void failed(final Exception ex) { 142 latch2.countDown(); 143 System.out.println(request3.getRequestLine() + "->" + ex); 144 } 145 146 public void cancelled() { 147 latch2.countDown(); 148 System.out.println(request3.getRequestLine() + " cancelled"); 149 } 150 }); 151 System.out.println("#3 await..."); 152 latch2.await(); 153 System.out.println("#3 done."); 154 155 } finally { 156 httpclient.close(); 157 } 158 } 159}

これを実行すると、サーバー側では以下のようなPOSTメソッドなHTTPリクエストを受信します。(実際には3つリクエストしますが、1つだけ示したものです)

terminal

1$ nc -l 8000 2POST /cgi-bin/t1.py HTTP/1.1 3Content-Length: 15 4Content-Type: application/x-www-form-urlencoded; charset=UTF-8 5Host: localhost:8000 6Connection: Keep-Alive 7User-Agent: Apache-HttpAsyncClient/4.1.4 (Java/11.0.9) 8 9p11=v11&p12=v12

Windows10上で、Java SE11(11.0.9)で実行しました。

投稿2021/01/24 08:45

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

使ったことはないですが、これはどうでしょうか?
https://news.mynavi.jp/article/imajava-10/

投稿2021/01/22 12:46

68user

総合スコア2005

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問