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

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

ただいまの
回答率

90.53%

  • Java

    13740questions

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

  • Android

    6503questions

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

  • サーバ

    770questions

    サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

  • XML

    651questions

    XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

  • HTTP

    544questions

    HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

http通信でxml形式でサーバーにデータを送る方法

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,911

SmartBuzz

score 73

xml形式でサーバーにデータを送信する方法をご教授願いたいです。

送りたい形式は
<test>
<name>name</name>
<address>address</address>
</test>
という形式を送りたいです。

現状、サーバーからレスポンスが返ってきますが、うまく内容が送れていないようです。
サーバーからのレスポンスは、今回送った内容と登録が正常に終わったかどうかのコードが返ってきますが、現状内容が空で、通信系エラーコードが返ってきます。

【期待値】
<test>
<name>teratail</name>
<address>test@teratail.com</address>
<code>1</code>
</test>

【現状】
<test>
<name></name>
<address></address>
<code>2</code>
</test>
(2は通信エラー系です)

※コードを解決済みコードに編集しました

// 挿入用データをString型で作成
        String dataString =
                "<test>" +
                        "<name>" + name + "</name>" +
                        "<adress>" + adress + "</adress>" +
                        "</test>";

        try {
            new HttpPostTask().execute("https://test.com/xxxxx/xxxx/xxx.asp", dataString);
        } catch (Exception e) {
            e.printStackTrace();
        }


public final class HttpPostTask extends AsyncTask<String, Void, Void> {
        @Override
        protected Void doInBackground(String... strings) {

            URL url = null;
            int length = 0;
            try{
                url = new URL(strings[0]);
            }catch(MalformedURLException e){
                e.printStackTrace();
            }

            // コンテンツの長さを取得
            try {
                // StringBuilderを文字列に変化してからバイト長を取得
                length = strings[1].getBytes(CHARSET).length;
            } catch (UnsupportedEncodingException e1) {
                e1.printStackTrace();
            }

            Log.d("XML",strings[1]);

            HttpsURLConnection con = null;
            try {
                con = (HttpsURLConnection) url.openConnection();
                con.setRequestMethod("POST");
                con.setDoOutput(true);
                con.setDoInput(true);
                con.setFixedLengthStreamingMode(245);
                // 持続接続を設定
                con.setRequestProperty("Connection", "Keep-Alive");
                // POSTデータの形式を設定
                con.setRequestProperty("Content-Type", String.format("text/plain; boundary=%s", BOURDARY));
                // POSTデータの長さを設定
                con.setRequestProperty("Content-Length", String.valueOf(length));
                con.connect();

                // POSTデータ送信処理
                OutputStream out = null;
                try {
                    out = con.getOutputStream();
                    out.write(strings[1].getBytes("UTF-8"));
                    out.flush();
                } catch (IOException e) {
                    // POST送信エラー
                    e.printStackTrace();
                } finally {
                    if (out != null) {
                        out.close();
                    }
                }


                final int status = con.getResponseCode();
                if (status == HttpURLConnection.HTTP_OK) {
                    // 正常
                    // レスポンス取得処理を実行
                    InputStream inputStream =con.getInputStream();
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

                    StringBuffer buffer = new StringBuffer();
                    String temp = null;

                    while((temp = bufferedReader.readLine()) != null) {
                        buffer.append(temp);
                    }

                    Log.d("BUFF",buffer.toString());

                }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (con != null) {
                    con.disconnect();
                }
            }
            return null;
        }

    }

よろしくお願いします。

【サーバー側仕様】
「アプリ⇨サーバー」

データID データ名称 分類 Xpath式 データ型
P01_01 test ELM /test/
P01_02 name TXT /test/name CHAR
P01_03 address TXT /test/address VACHAR

「サーバー⇨アプリ」
上記の要求に対する応答

データID データ名称 分類 Xpath式 データ型 応答内容
P03_01 test ELM /test/
P03_02 name TXT /test/name CHAR 送信内容
P03_03 address TXT /test/address VACHAR 送信内容
P03_04 code TXT /test/address CHAR 1:完了2:通信エラー系など3:重複登録4:その他エラー

【サーバーへのリクエスト】
dataStringをログで出したもの

コード
<test><address>test@test.co.jp</address><name>testname</name></test>

【サーバーからのレスポンス】 
bufferをwhileが終わった後に.toStringしてログで出したもの

コード
<?xml version="1.0" encoding="Shift_JIS"?><test>    <name></name><address></address>    <code>2</code></test>

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yona

    2017/03/01 18:33

    うまく送れていないとはどんな状態ですか、具体的に書いてください。

    キャンセル

回答 3

checkベストアンサー

+2

setChunkedStreamingModeを使用している理由を教えてください。
特にないのであれば、
setFixedLengthStreamingModeの使用を検討してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/03 17:48

    原因はご指摘頂いたこのメソットでした。
    しかし、このメソットがなぜ悪いのJavaのリファレンスを見てもかわからなかったので質問させて下さい…。

    送信時データをlengthで取得してsetFixedLengthStreamingModeの引数で与えて見ると、エクセプションが出ますが、サーバーレスポンスに245バイトあると書いていたので、245と入れると問題なくサーバー通信ができるようになりました。
    この経緯から、この引数サイズは送信ではなく受信側なのかな?と思っているのですが、いまいちわからなかったので、別の質問を作りました。
    回答いただけると嬉しいです。宜しくお願いします。

    https://teratail.com/questions/67855?modal=q-comp

    キャンセル

  • 2017/03/03 17:55

    ChunkedStreamingModeは単純にサーバー側、
    もしくは、サーバーとの間に挟まっているプロキシが対応していない可能性があるみたいです。

    サイズの件は・・・
    con.connect();する前に、strings[1].getBytes("UTF-8")で得られる
    バイト配列のlenghtを渡す必要があるのですが、大丈夫ですか?

    キャンセル

  • 2017/03/03 18:05

    サイズの件はまさしくその通りでした…。

    送信側のデータサイズを引数に与えると言うことですね。
    しかし、私はその数値を図る変数を間違えていたので、エクセプションが出ていたようです…。

    ありがとうございました…!

    キャンセル

+1

下記の理由が考えられます。
・サーバー側のプログラムがおかしい
・そもそも送るXMLの値がおかしい

Android側のコードだけを見ていても仕方ないので、サーバー側の仕様や実際に送られてきたデータを見ないと解決できないと思いますよ。
通信系のエラーではわかりません、具体的にどのような時にそのレスポンスを返すのかを書いてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/02 10:38 編集

    サーバーの仕様とリクエストとレスポンスの内容を追記しました。
    サーバー側の仕様は、追記した表以外はわかりません。
    通信系のエラーというのも、帰ってきた値に2と入っているだけで、exceptionがアプリ側で出ている等ではありません。
    よろしくお願いします。

    キャンセル

  • 2017/03/02 11:13

    他にどんなエラーコードがあるかはわかりませんが、送った内容が間違っていて通信系のエラーになるのはおかしいと思いますよ。サーバーがどんな時に通信系のエラーコードを返すのかという情報がない限り解決できないと思いますよ。

    また、リクエスト時にxmlの<?xml version="1.0" encoding="Shift_JIS"?>は不要なんですか?

    キャンセル

  • 2017/03/03 15:35

    <?xml version="1.0" encoding="Shift_JIS"?>
    を頭につけて見ましたが、状況変わらずでした。

    通信系エラーで返ってきている原因と、XMLのフォーマットがあっているのかどうかを、サーバーを作った方に確認して見ます。

    キャンセル

  • 2017/03/03 16:01

    encoding="UTF-8" では?
    out.write(strings[1].getBytes("UTF-8")); とコーディングしてますよね?
    言われたままではなく、ちゃんと調べてから使ってください。

    キャンセル

  • 2017/03/03 16:07

    あ、本当だ、ごめんなさい。
    レスポンスではShift_JISなのでこの辺も怪しいのですね。

    キャンセル

  • 2017/03/03 16:45

    その辺の認識としては、AndroidStudioだと文字コードがUTF-8なので、送る情報はUTF-8。返ってきてるのは、Shift_JISで返ってくる。というのであっていますでしょうか…?

    なので、コーディングとしては送信時の文字コードは全てUTF-8で指定しないといけないということですか?

    キャンセル

  • 2017/03/03 16:58

    あと、送信後に出しているログとリクエストで出したログの間に
    「D/NetworkSecurityConfig: No Network Security Config specified, using platform default」
    というエラーメッセージが出てくるのですが、これは何か関係があるでしょうか・・・。

    調べてみると、SSLのAndroidの脆弱性に関しては出てくるのですが、特に何かコード等で記載する必要がある情報は見つからなかったのですが…。

    キャンセル

+1

POSTで送信していないようです。
HttpURLConnectionのデフォルトのメソッドはGETです。
対向サーバがGETを許容せず通信エラーを返している可能性もあります。

そして、POSTで送信する場合、BODY部の長さを指定してあげなければいけません。
さらに、XML形式で送信する場合はContent-Typeをapplication/xmlで指定してあげる必要があります。
サーバがXMLに対して厳格な場合はyonaさんがおっしゃっているようにXML宣言をする必要があります。

POST送信は以下のページが参考になります。
http://msdev.sakura.ne.jp/know-how/?p=8

このページを参考にしてContent-Typeをapplication/xmlとした上で試してはいかがでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/03 15:38

    教えていただいたページを元に、BODY部の長さを指定して、Content-Typeを指定して見ましたが、状況変わらずでした。

    connection.setRequestMethod("POST");
    // 持続接続を設定
    connection.setRequestProperty("Connection", "Keep-Alive");
    // POSTデータの形式を設定
    connection.setRequestProperty("Content-Type", String.format("text/plain; boundary=%s", BOURDARY));
    // POSTデータの長さを設定
    connection.setRequestProperty("Content-Length", String.valueOf(iContentsLength));

    あとは、通信エラーだったので、httpsかな?と思いHttpsURLConnectionクラスを使って見ましたが、こちらも状況変わらずでした…。

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13740questions

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

  • Android

    6503questions

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

  • サーバ

    770questions

    サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

  • XML

    651questions

    XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

  • HTTP

    544questions

    HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。