AWSのAPI Gatewayを用いて、画像(jpg)をPOSTしたらJsonを返すAPIを作成しました。
curlでは想定通りの動きをします。
$ curl --request POST -H "Content-Type:image/jpeg" --data-binary "@sample.jpg" https://xxx.execute-api.ap-northeast-1.amazonaws.com/Prod {"statusCode": 200, ...
そしてAndroidアプリでこのAPIに画像をPOSTしてレスポンスを表示したいと思っています。
とりあえず画像をPOSTしてみようと思いこのサイトを参考に試しているのですが、いまいちうまくいきません。
・MainActivity.java(参考元からurlのみ変更)
java
1try { 2 Bitmap bmp = getBitmapFromUri(uri); 3 imageView.setImageBitmap(bmp); 4 new PostBmpAsyncHttpRequest(self).execute(new Param("https://xxx.execute-api.ap-northeast-1.amazonaws.com/Prod", bmp)); 5} catch (IOException e) { 6 e.printStackTrace(); 7}
・ PostBmpAsyncHttpRequest.java(参考元から変更なし)
java
1... 2 @Override 3 protected String doInBackground(Param... params) { 4 Param param = params[0]; 5 HttpURLConnection connection = null; 6 StringBuilder sb = new StringBuilder(); 7 try { 8 // 画像をjpeg形式でstreamに保存 9 ByteArrayOutputStream jpg = new ByteArrayOutputStream(); 10 param.bmp.compress(Bitmap.CompressFormat.JPEG, 100, jpg); 11 12 13 URL url = new URL(param.uri); 14 connection = (HttpURLConnection) url.openConnection(); 15 connection.setConnectTimeout(3000);//接続タイムアウトを設定する。 16 connection.setReadTimeout(3000);//レスポンスデータ読み取りタイムアウトを設定する。 17 connection.setRequestMethod("POST");//HTTPのメソッドをPOSTに設定する。 18 //ヘッダーを設定する 19 connection.setRequestProperty("User-Agent", "Android"); 20 connection.setRequestProperty("Content-Type","application/octet-stream"); 21 connection.setDoInput(true);//リクエストのボディ送信を許可する 22 connection.setDoOutput(true);//レスポンスのボディ受信を許可する 23 connection.setUseCaches(false);//キャッシュを使用しない 24 connection.connect(); 25...
・エラー
W/System.err: java.io.FileNotFoundException: https://xxx.execute-api.ap-northeast-1.amazonaws.com/Prod at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:251) at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:26) at com.example.post.PostBmpAsyncHttpRequest.doInBackground(PostBmpAsyncHttpRequest.java:55) at com.example.post.PostBmpAsyncHttpRequest.doInBackground(PostBmpAsyncHttpRequest.java:18) at android.os.AsyncTask$2.call(AsyncTask.java:333) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:764)
おそらくurlの形がよくないと思っています。(参考元は../x.phpだったので)
この方法でなくとも他にAPIに画像をPOSTする方法を教えていただければと思います。
ちなみに適当なサイトのurl(https://www.amazon.co.jpなど)に変更したらレスポンスは帰ってきはするので、ネットワークに繋がっていないということはないと思います。
バージョン
Android Studio 3.5
あなたの回答
tips
プレビュー