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

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

ただいまの
回答率

90.53%

  • Xamarin

    496questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

  • POST

    230questions

    POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Xamarin.formsからxmlデータをPOST送信したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,850

otaota

score 22

前提・実現したいこと

とあるAPIで、指定されたURLにxml文字列をPOSTするというものがあり、
Xamarin.formsで実装しているのですが、期待した結果が得られず困っています。
アドバイス御願いします。

発生している問題・エラーメッセージ

該当のソースコードに記載したような方法で通信しています。
result.StatusCodeの値は200を返すので通信自体は正常に行われているようですが、肝心のxmlデータが正しく送れていないようで、result.Content.ReadAsStringAsync()で得られる戻り値はAPIのエラーメッセージになってしまいます。

該当のソースコード

        async Task<string> ResponseAsync(String url)
        {
            var client = new HttpClient();
            var content = new MultipartFormDataContent();
            var data = new StringContent(xmlstr);
            content.Headers.ContentType = new MediaTypeHeaderValue("text/xml");
            content.Add(data);

            var result = await client.PostAsync(url, content);

            Debug.WriteLine("StatusCode : " + result.StatusCode);

            var res = await result.Content.ReadAsStringAsync();
            return res;
        }

試したこと

ChromeのAdvanced REST clientというツールで、Raw payloadに送りたいxml文字列を直接コピペし、同じURLへPOST送信した時は、期待した動作をすることは確認しています。

また、送信先を自前のサーバー上の

<h1>post</h1><BR>
<?php var_dump($_POST);?>
<br><br>

<h1>header</h1><br>
<?php
foreach (getallheaders() as $name => $value) {
    echo "$name: $value<br>\n";
}
?>
<br>

<h1>body</h1><br>
<?php
echo file_get_contents('php://input')."<br>\n";
?>
<br>

<h1>param</h1><br>
<?php
echo $_SERVER["SERVER_NAME"]."<br>\n";
echo $_SERVER["SCRIPT_NAME"]."<br>\n";
echo $_SERVER["QUERY_STRING"]."<br>\n";
echo $_SERVER["SCRIPT_FILENAME"]."<br>\n";
echo $_SERVER["REQUEST_URI"]."<br>\n";
?>


というphpに変更したところ、Advanced REST clientから送った場合は、bodyのところでxmlの文字列がそのまま取得できているのに対して、Xamarinから送った場合は、xml文字列の前に

--a96cdf07-xxxx-yyyy-zzzz-b9e1d5f1fe5(<-公開して良い情報かわからないので一部文字を伏せています)
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data


のような文字列が付加されています。これがエラーの原因だと思うのですが、これを付加されなくする方法がわかりません。

ちなみに、別件ですが、bodyをともなわないHeader情報のみのPOST通信は

async Task<string> GetToken( String url )
{
    var client = new HttpClient();
    var postData = new List<KeyValuePair<string, string>>();
    postData.Add(new KeyValuePair<string, string>(key1, val1));
    postData.Add(new KeyValuePair<string, string>(key2, val2));
    postData.Add(new KeyValuePair<string, string>(key3, val3));
    var content = new FormUrlEncodedContent(postData);
    var response = await client.PostAsync(url, content);
    string res = response.Content.ReadAsStringAsync().Result;

    Debug.WriteLine(res);
    return res;
}


のような感じで問題なく使えています。

さらに、試しにObjective-Cで同様のことをしたらどうなるか試してみました。

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    request.HTTPMethod = @"POST";
    NSString *body = [NSString stringWithFormat:xmlstr];
    request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];


というコードで期待通りの動作をしました。
なので、アプリだからというわけではなく、C#でのbodyの設定の仕方の問題ではないかと判断しています。

補足情報(言語/FW/ツール等のバージョンなど)

Xamarin 6.2(build 1829) 
Mac Note Pro 
OS X Yosemite(10.10.5)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

+1

自己解決しました。
bodyを送るにはMultipartFormDataContentを使うという記述をどこかで見たので、それにこだわっていたのですが、単純に以下の記述で大丈夫でした。

            var client = new HttpClient();
            var httpcontent = new StringContent(xmlstr2, Encoding.UTF8, "text/xml");

            var result = await client.PostAsync(url, httpcontent);

https://forums.xamarin.com/discussion/11067/anyone-had-problems-with-sending-post-data-to-a-rest-web-service-in-ios7
が参考になりました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Xamarin

    496questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

  • POST

    230questions

    POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。