web-dev-qa-db-ja.com

XMLを返すWeb API

WEB APIメソッドが呼び出し元のアプリケーションにXMLオブジェクトを返すようにします。現在、XMLを文字列オブジェクトとして返しているだけです。これはノーですか?もしそうなら、どのようにwebapi getメソッドにXML型のオブジェクトを返していることを伝えるのですか?

ありがとう

編集:Getメソッドの例:

[AcceptVerbs("GET")]
public HttpResponseMessage Get(int tenantID, string dataType, string ActionName)
{
   List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData
            ("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList();
   string AllResults = "";
   for (int i = 0; i < SQLResult.Count - 1; i++)
   {
       AllResults += SQLResult[i];
   }
    string sSyncData = "<?xml version=\"1.0\"?> " + AllResults;
    HttpResponseMessage response = new HttpResponseMessage();
    response.Content = new StringContent(sSyncData);
    return response;          
}

私はまだプロトタイプの段階にあるので、少しハックします。私はその実行可能性を証明できるときにリファクタリングします。

41
Matt

シリアライズ可能なオブジェクトを返す場合、WebAPIはクライアントが送信するAcceptヘッダーに基づいてJSONまたはXMLを自動的に送信します。

文字列を返す場合、文字列を取得します。

37
Adam Baxter

コントローラーに戻りオブジェクトのタイプを決定させたくない場合は、メソッドの戻りタイプをSystem.Net.Http.HttpResponseMessageに設定し、以下のコードを使用してXMLを返す必要があります。

public HttpResponseMessage Authenticate()
{
  //process the request 
  .........

  string XML="<note><body>Message content</body></note>";
  return new HttpResponseMessage() 
  { 
    Content = new StringContent(XML, Encoding.UTF8, "application/xml") 
  };
}

これは、常にWeb APIからXMLを返す最も簡単な方法です。

82
Arkadas Kilic

IHttpActionResult戻り値型と互換性がある別の方法を次に示します。この場合、データコントラクトシリアライザーの代わりにXMLシリアライザー(オプション)を使用するように求めています。return ResponseMessage( IHttpActionResultと互換性のある戻り値を取得します。

return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK)
       {
           Content = new ObjectContent<SomeType>(objectToSerialize, 
              new System.Net.Http.Formatting.XmlMediaTypeFormatter { 
                  UseXmlSerializer = true 
              })
       });
21
AaronLS

オブジェクトを返すだけで、XMLまたはJSONかどうかを気にする必要はありません。 Web APIからJSONまたはXMLを要求するのはクライアントの責任です。たとえば、Internet Explorerを使用して呼び出しを行う場合、要求されるデフォルトの形式はJsonであり、Web APIはJsonを返します。ただし、Google Chromeを介してリクエストを行う場合、デフォルトのリクエスト形式はXMLであり、XMLが返されます。

Fiddler を使用してリクエストを行う場合、AcceptヘッダーをJsonまたはXMLのいずれかに指定できます。

Accept: application/xml

次の記事をご覧ください: ASP.NET MVC4 Web APIベータ版のコンテンツネゴシエーション–パート1

編集:コードを使用して編集した質問に基づいて:

文字列をXMLに変換するのではなく、単純なリストを返します。 Fiddlerを使用して試してください。

public List<string> Get(int tenantID, string dataType, string ActionName)
    {
       List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList();
       return SQLResult;
     }

たとえば、リストが次のような場合:

List<string> list = new List<string>();
list.Add("Test1");
list.Add("Test2");
list.Add("Test3");
return list;

Accept: application/xmlを指定すると、出力は次のようになります。

<ArrayOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.Microsoft.com/2003/10/Serialization/Arrays">
  <string>Test1</string>
  <string>Test2</string>
  <string>Test3</string>
</ArrayOfstring>

リクエストで「Accept:application/json」を指定すると、出力は次のようになります。

[
  "Test1",
  "Test2",
  "Test3"
]

したがって、カスタマイズされたxmlを送信する代わりに、クライアントがコンテンツタイプを要求できるようにします。

17
Habib