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

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

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

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

HTTP

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

Java

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

Android

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

サーバ

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

Q&A

解決済

3回答

19012閲覧

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

SmartBuzz

総合スコア81

XML

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

HTTP

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

Java

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

Android

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

サーバ

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

0グッド

1クリップ

投稿2017/03/01 09:28

編集2017/03/03 09:04

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は通信エラー系です)

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

java

1 2// 挿入用データをString型で作成 3 String dataString = 4 "<test>" + 5 "<name>" + name + "</name>" + 6 "<adress>" + adress + "</adress>" + 7 "</test>"; 8 9 try { 10 new HttpPostTask().execute("https://test.com/xxxxx/xxxx/xxx.asp", dataString); 11 } catch (Exception e) { 12 e.printStackTrace(); 13 } 14 15 16public final class HttpPostTask extends AsyncTask<String, Void, Void> { 17 @Override 18 protected Void doInBackground(String... strings) { 19 20 URL url = null; 21 int length = 0; 22 try{ 23 url = new URL(strings[0]); 24 }catch(MalformedURLException e){ 25 e.printStackTrace(); 26 } 27 28 // コンテンツの長さを取得 29 try { 30 // StringBuilderを文字列に変化してからバイト長を取得 31 length = strings[1].getBytes(CHARSET).length; 32 } catch (UnsupportedEncodingException e1) { 33 e1.printStackTrace(); 34 } 35 36 Log.d("XML",strings[1]); 37 38 HttpsURLConnection con = null; 39 try { 40 con = (HttpsURLConnection) url.openConnection(); 41 con.setRequestMethod("POST"); 42 con.setDoOutput(true); 43 con.setDoInput(true); 44 con.setFixedLengthStreamingMode(245); 45 // 持続接続を設定 46 con.setRequestProperty("Connection", "Keep-Alive"); 47 // POSTデータの形式を設定 48 con.setRequestProperty("Content-Type", String.format("text/plain; boundary=%s", BOURDARY)); 49 // POSTデータの長さを設定 50 con.setRequestProperty("Content-Length", String.valueOf(length)); 51 con.connect(); 52 53 // POSTデータ送信処理 54 OutputStream out = null; 55 try { 56 out = con.getOutputStream(); 57 out.write(strings[1].getBytes("UTF-8")); 58 out.flush(); 59 } catch (IOException e) { 60 // POST送信エラー 61 e.printStackTrace(); 62 } finally { 63 if (out != null) { 64 out.close(); 65 } 66 } 67 68 69 final int status = con.getResponseCode(); 70 if (status == HttpURLConnection.HTTP_OK) { 71 // 正常 72 // レスポンス取得処理を実行 73 InputStream inputStream =con.getInputStream(); 74 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 75 76 StringBuffer buffer = new StringBuffer(); 77 String temp = null; 78 79 while((temp = bufferedReader.readLine()) != null) { 80 buffer.append(temp); 81 } 82 83 Log.d("BUFF",buffer.toString()); 84 85 } 86 87 } catch (IOException e) { 88 e.printStackTrace(); 89 } finally { 90 if (con != null) { 91 con.disconnect(); 92 } 93 } 94 return null; 95 } 96 97 }

よろしくお願いします。

【サーバー側仕様】
「アプリ⇨サーバー」
|データ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>

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

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

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

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

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

yona

2017/03/01 09:33

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

回答3

0

ベストアンサー

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

投稿2017/03/03 08:08

abs123

総合スコア1280

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

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

SmartBuzz

2017/03/03 08:48

原因はご指摘頂いたこのメソットでした。 しかし、このメソットがなぜ悪いのJavaのリファレンスを見てもかわからなかったので質問させて下さい…。 送信時データをlengthで取得してsetFixedLengthStreamingModeの引数で与えて見ると、エクセプションが出ますが、サーバーレスポンスに245バイトあると書いていたので、245と入れると問題なくサーバー通信ができるようになりました。 この経緯から、この引数サイズは送信ではなく受信側なのかな?と思っているのですが、いまいちわからなかったので、別の質問を作りました。 回答いただけると嬉しいです。宜しくお願いします。 https://teratail.com/questions/67855?modal=q-comp
abs123

2017/03/03 08:55

ChunkedStreamingModeは単純にサーバー側、 もしくは、サーバーとの間に挟まっているプロキシが対応していない可能性があるみたいです。 サイズの件は・・・ con.connect();する前に、strings[1].getBytes("UTF-8")で得られる バイト配列のlenghtを渡す必要があるのですが、大丈夫ですか?
SmartBuzz

2017/03/03 09:05

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

0

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/02 13:23

nakasho_dev

総合スコア2655

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

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

SmartBuzz

2017/03/03 06: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クラスを使って見ましたが、こちらも状況変わらずでした…。
guest

0

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

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

投稿2017/03/02 01:05

yona

総合スコア18155

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

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

SmartBuzz

2017/03/02 01:38 編集

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

2017/03/02 02:13

他にどんなエラーコードがあるかはわかりませんが、送った内容が間違っていて通信系のエラーになるのはおかしいと思いますよ。サーバーがどんな時に通信系のエラーコードを返すのかという情報がない限り解決できないと思いますよ。 また、リクエスト時にxmlの<?xml version="1.0" encoding="Shift_JIS"?>は不要なんですか?
SmartBuzz

2017/03/03 06:35

<?xml version="1.0" encoding="Shift_JIS"?> を頭につけて見ましたが、状況変わらずでした。 通信系エラーで返ってきている原因と、XMLのフォーマットがあっているのかどうかを、サーバーを作った方に確認して見ます。
abs123

2017/03/03 07:01

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

2017/03/03 07:07

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

2017/03/03 07:45

その辺の認識としては、AndroidStudioだと文字コードがUTF-8なので、送る情報はUTF-8。返ってきてるのは、Shift_JISで返ってくる。というのであっていますでしょうか…? なので、コーディングとしては送信時の文字コードは全てUTF-8で指定しないといけないということですか?
SmartBuzz

2017/03/03 07:58

あと、送信後に出しているログとリクエストで出したログの間に 「D/NetworkSecurityConfig: No Network Security Config specified, using platform default」 というエラーメッセージが出てくるのですが、これは何か関係があるでしょうか・・・。 調べてみると、SSLのAndroidの脆弱性に関しては出てくるのですが、特に何かコード等で記載する必要がある情報は見つからなかったのですが…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問