###前提・実現したいこと
とある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)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。