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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

11176閲覧

JavaのHttpURLConnectionのリクエスト内容を確認する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/05/31 12:51

編集2016/05/31 13:06

お世話になっております。

現在,Android端末のストレージから画像をuploadする機能を作成しています。
サーバ側が独自のmultipart形式を受け入れる仕様になっているため,
書式が正しければ画像がuploadされるはずなのですが,
connection.getResponseMessage()でレスポンスを見ると
Required MultipartFile parameter 'file' is not present
というエラーが返ってきます。(外部ストレージへの接続はできているようです。)
なので,POSTした時のリクエスト内容を確認したいのですが,
javaでリクエストヘッダやボディをprotocolの表記形式(このサイトのような表記形式)に近い形で見る方法はあるでしょうか。(送信前にヘッダが見れるのは知っています。bodyは文字列格納してからencodeすればencode時の文字列で確認できるのもわかります。実際に送られているリクエストがプロトコル形式でどうなっているか見る方法があるかないか知りたいという意味です。)
リクエスト内容が確認できれば,自力で直せるとは思うので,(リファクタリング前の酷いコードなのもあり)載せる必要はあまりないかもしれませんが念のため,コードを載せます。
以下のようにoutputstreamに書き込まれているデータを読み出せればいいのですが,どうやってデバッグするのがいいでしょうか。
普段javaでコードを書かないため,くだらない質問かもしれませんが,経験がある方アドバイスいただければと思います。

java

1class UploadImage extends AsyncTask<URL, Void, String> { 2 3 Context c; 4 5 public UploadImage(Context c) 6 super() 7 this.c = c; 8 } 9 10 protected String doInBackground(URL... url) { 11 uploadImage(this.c); 12 return ""; 13 } 14 15 void uploadImage(Context c){ 16 17 File destDir = new File(Environment.getExternalStorageDirectory(). 18 getPath() + "/my_images/"); 19 File[] files = destDir.listFiles(); 20 String uri = "https://hogehoge.com"; 21 String base64_pass = "my_base64"; 22 for (int i = 0;i<files.length;i++) { 23 try { 24 sendMultipart(uri, base64_pass, files[i]); 25 } catch (Exception e) { 26// Toast.makeText(c, e.getMessage(), Toast.LENGTH_SHORT).show(); 27 } 28 } 29 } 30 private void sendMultipart(String uri,String password, File file) throws IOException { 31 32 URL url = new URL(uri); 33 HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); 34 final String twoHyphens = "--"; 35 final String boundary = twoHyphens+"*****"+ UUID.randomUUID().toString()+"*****"; 36 final String lineEnd = "\r\n"; 37 final int maxBufferSize = 1024*1024*3; 38 39 40 String filefield = "file"; 41 42 connection.setDoInput(true); 43 connection.setDoOutput(true); 44 connection.setUseCaches(false); 45 46 connection.setRequestMethod("POST"); 47 connection.setRequestProperty("Authorization(独自のproperty)", password); 48 connection.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary); 49 50 DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); 51 outputStream.writeBytes(boundary + lineEnd); 52 outputStream.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() +"\"" + lineEnd); 53 outputStream.writeBytes("Content-Type: application/octet-stream" + lineEnd); 54 outputStream.writeBytes(lineEnd); 55 56 FileInputStream fileInputStream = new FileInputStream(file); 57 int bytesAvailable = fileInputStream.available(); 58 int bufferSize = Math.min(bytesAvailable, maxBufferSize); 59 byte[] buffer = new byte[bufferSize]; 60 61 int bytesRead = fileInputStream.read(buffer, 0, bufferSize); 62 while(bytesRead > 0) { 63 outputStream.write(buffer, 0, bufferSize); 64 bytesAvailable = fileInputStream.available(); 65 bufferSize = Math.min(bytesAvailable, maxBufferSize); 66 bytesRead = fileInputStream.read(buffer, 0, bufferSize); 67 } 68 outputStream.writeBytes(lineEnd); 69 outputStream.writeBytes(lineEnd); 70 outputStream.writeBytes(boundary + twoHyphens + lineEnd); 71 72 if( connection.getResponseCode() == HttpURLConnection.HTTP_OK ){ 73 //log に成功した旨を記載 74 }else{ 75 //logに失敗した旨を記載 76 Log.e("ERROR",connection.getResponseMessage()) 77 } 78 connection.close(); 79 } 80}

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

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

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

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

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

guest

回答2

0

ベストアンサー

リクエストした内容がエンドポイントで確認できるrequestbinというサービスをみつけ正常なリクエストと内容を比較することで解決することができました。
リクエスト内容に微妙な脱字があったため,リクエストが通らなかったことが判明しました。

投稿2016/06/06 03:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

HTTP本文が正しくマルチパートで送信できているかのバリデーションも通過するように自前で作っていくのは結構な手間かと思います。

もしすでに実行済みで動かなかったら申しわけないのですが、マルチパートもHTTP送受信できる Commons-HTTPComponentという、JavaがらHTTPクライアントを動作させるためのライブラリが提供されています。

この例(http://hc.apache.org/httpcomponents-client-4.5.x/httpmime/examples/org/apache/http/examples/entity/mime/ClientMultipartFormPost.java)のように、マルチパートでの送信について書いてあるサンプルもありますので、参考にされてはいかがでしょうか。

投稿2016/05/31 15:40

A-pZ

総合スコア12011

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

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

退会済みユーザー

退会済みユーザー

2016/06/01 00:22 編集

なるほどありがとうございます。 ただAndroidは現在http(s)URLConnection以外の実装は非推奨かつ廃止される予定になっているので自前で実装しています。.NetFrameWorkやjavascriptで同じような実装をしたことがあるので出来ることは分かってるので手間というほど手間は感じていないのですが,javaはリクエスト内容の確認方法が分からず消耗しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問