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

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

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

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

Xamarin

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

Q&A

解決済

1回答

5465閲覧

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

otaota

総合スコア30

POST

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

Xamarin

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

0グッド

0クリップ

投稿2017/04/03 01:24

編集2017/04/07 09:05

###前提・実現したいこと
とある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-0b9e1d5f1fe5(<-公開して良い情報かわからないので一部文字を伏せています) 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)

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
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
が参考になりました。

投稿2017/04/11 01:13

otaota

総合スコア30

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問