programing

XML을 반환하는 WebAPI

muds 2023. 6. 10. 09:49
반응형

XML을 반환하는 WebAPI

나는 내 WEB API 메서드가 호출 중인 응용 프로그램에 XML 개체를 다시 반환하기를 원합니다.현재 XML을 문자열 개체로 반환하는 중입니다.안 돼요?그렇다면 webapiet 메서드에 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;          
}

아직 시제품 제작 단계이기 때문에 좀 구식입니다.실행 가능성을 증명할 수 있을 때 리팩터하겠습니다.

유형을 을 설정해야 합니다.System.Net.Http.HttpResponseMessage합니다.

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") 
  };
}

이 방법은 항상 웹 API에서 XML을 반환하는 가장 빠른 방법입니다.

직렬화 가능한 개체를 반환하는 경우 WebAPI는 클라이언트가 보내는 Accept 헤더를 기준으로 JSON 또는 XML을 자동으로 보냅니다.

끈을 반납하시면 끈을 드립니다.

다음은 IHTTPActionResult 반환 유형과 호환되는 다른 방법입니다. Contract 대신 XML 계약 serializer)를 return ResponseMessage(IHTTPActionResult와 호환되는 반품을 받기 위해:

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

당신은 단순히 당신의 객체를 반환해야 하며, 그것의 XML인지 JSON인지에 대해 걱정할 필요가 없습니다.웹 API에서 JSON 또는 XML을 요청하는 것은 고객의 책임입니다.예를 들어 Internet Explorer를 사용하여 전화를 걸 경우 요청된 기본 형식은 Json이고 웹 API는 Json을 반환합니다.하지만 구글 크롬을 통해 요청을 하면 기본 요청 형식은 XML이고 XML을 다시 받을 수 있습니다.

Fiddler를 사용하여 요청할 경우 Accept 헤더를 Json 또는 XML로 지정할 수 있습니다.

Accept: application/xml

다음 기사를 볼 수 있습니다.ASP.NET MVC4 웹 API 베타에서의 콘텐츠 협상 - Part 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을 보내는 대신 클라이언트가 콘텐츠 유형을 요청할 수 있습니다.

netcore 2.2를 사용하는 프로젝트에서는 다음 코드를 사용합니다.

[HttpGet]
[Route( "something" )]
public IActionResult GetSomething()
{
    string payload = "Something";

    OkObjectResult result = Ok( payload );

    // currently result.Formatters is empty but we'd like to ensure it will be so in the future
    result.Formatters.Clear();

    // force response as xml
    result.Formatters.Add( new Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerOutputFormatter() );

    return result;
}

컨트롤러 내에서 하나의 작업만 강제로 XML을 반환하고 다른 작업에는 영향을 주지 않습니다.또한 이 코드에는 일회용 개체인 HttpResponseMessage나 StringContent 또는 ObjectContent가 포함되어 있지 않으므로 적절하게 처리해야 합니다(특히 이에 대해 알려주는 코드 분석기를 사용하는 경우).

더 나아가 다음과 같은 편리한 확장 기능을 사용할 수 있습니다.

public static class ObjectResultExtensions
{
    public static T ForceResultAsXml<T>( this T result )
        where T : ObjectResult
    {
        result.Formatters.Clear();
        result.Formatters.Add( new Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerOutputFormatter() );

        return result;
    }
}

그러면 코드는 다음과 같이 됩니다.

[HttpGet]
[Route( "something" )]
public IActionResult GetSomething()
{
    string payload = "Something";

    return Ok( payload ).ForceResultAsXml();
}

또한 이 솔루션은 xml로 반환을 강제하는 명시적이고 깨끗한 방법처럼 보이며 기존 코드에 쉽게 추가할 수 있습니다.

추신: 저는 정식 이름인 마이크로소프트를 사용했습니다.AsNetCore.MVC 포맷터.모호성을 방지하기 위해 XmlSerializerOutputFormatter.

언급URL : https://stackoverflow.com/questions/11662028/webapi-to-return-xml

반응형