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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
setChunkedStreamingModeを使用している理由を教えてください。
特にないのであれば、
setFixedLengthStreamingModeの使用を検討してください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
下記の理由が考えられます。
・サーバー側のプログラムがおかしい
・そもそも送るXMLの値がおかしい
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とした上で試してはいかがでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
yona
2017/03/01 18:33
うまく送れていないとはどんな状態ですか、具体的に書いてください。