วิธีคืนสตริงดิบด้วย ApiController


125

ฉันมี ApiController ที่ทำหน้าที่ XML / JSON แต่ฉันต้องการให้การดำเนินการอย่างใดอย่างหนึ่งของฉันส่งคืน HTML บริสุทธิ์ ฉันลองด้านล่าง แต่มันยังคงส่งคืน XML / JSON

public string Get()
{
    return "<strong>test</strong>";
}

นี่คือผลตอบแทนข้างต้น:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">&lt;strong&gt;test&lt;/strong&gt;</string>

มีวิธีส่งคืนเฉพาะข้อความบริสุทธิ์ที่ไม่ใช้ Escape โดยไม่มีแท็ก XML โดยรอบหรือไม่ (อาจเป็นแอตทริบิวต์การดำเนินการส่งคืนประเภทอื่น)

คำตอบ:


223

คุณสามารถให้แอคชัน Web Api ส่งคืนHttpResponseMessageซึ่งคุณสามารถควบคุมเนื้อหาได้ทั้งหมด ในกรณีของคุณคุณอาจใช้ StringContent และระบุประเภทเนื้อหาที่ถูกต้อง:

public HttpResponseMessage Get()
{
    return new HttpResponseMessage()
    {
        Content = new StringContent(
            "<strong>test</strong>", 
            Encoding.UTF8, 
            "text/html"
        )
    };
}

หรือ

public IHttpActionResult Get()
{
    return base.ResponseMessage(new HttpResponseMessage()
    {
        Content = new StringContent(
            "<strong>test</strong>", 
            Encoding.UTF8, 
            "text/html"
        )
    });
}

ฉันยังไม่ได้ลอง แต่ฉันสงสัยว่าฉันตั้งค่าประเภทข้อมูลเป็น html จะใช้ได้หรือไม่?
แอด

5
ไม่มันจะไม่ทำงาน Web API มีรูปแบบ XML และ JSON ในตัวเท่านั้น สำหรับอย่างอื่นคุณจะต้องสร้างฟอร์แมตเตอร์ของคุณเองหรือส่งคืน HttpResponseMessages แบบดิบจากวิธีการของคุณดังที่แสดงในคำตอบของฉัน
Darin Dimitrov

HttpResponseMessage อยู่ในเนมสเปซ System.Net.Http
James Lawruk

8

อีกวิธีหนึ่งที่เป็นไปได้ ใน Web API 2 ฉันใช้ base.Content () เมธอดของAPIController:

    public IHttpActionResult Post()
    {
        return base.Content(HttpStatusCode.OK, new {} , new JsonMediaTypeFormatter(), "text/plain");
    }

ฉันต้องทำสิ่งนี้เพื่อแก้ไขข้อบกพร่องของ IE9 ซึ่งพยายามดาวน์โหลดเนื้อหา JSON อยู่เรื่อย ๆ สิ่งนี้ควรใช้ได้กับข้อมูลประเภท XML โดยใช้ตัวXmlMediaTypeFormatterจัดรูปแบบสื่อ

หวังว่าจะช่วยใครบางคน


OP กำลังขอคืนสตริง html .. สตริงดังกล่าวอยู่ที่ไหน และ JsonMediaTypeFormatter ส่งคืน html ได้อย่างไร
joedotnot

4

เพียงแค่จะไม่ทำงานก็จะถือว่าเป็นreturn Ok(value)IEnumerable<char>

ใช้return Ok(new { Value = value })หรือ simillar แทน


0

ฉันเรียกวิธีการควบคุม webapi2 ต่อไปนี้จากวิธีการควบคุม mvc:

<HttpPost>
Public Function TestApiCall(<FromBody> screenerRequest As JsonBaseContainer) As IHttpActionResult
    Dim response = Me.Request.CreateResponse(HttpStatusCode.OK)
    response.Content = New StringContent("{""foo"":""bar""}", Encoding.UTF8, "text/plain")
    Return ResponseMessage(response)
End Function

ฉันเรียกมันจากกิจวัตรนี้บนเซิร์ฟเวอร์ asp.net:

Public Async Function PostJsonContent(baseUri As String, requestUri As String, content As String, Optional timeout As Integer = 15, Optional failedResponse As String = "", Optional ignoreSslCertErrors As Boolean = False) As Task(Of String)
    Return Await PostJsonContent(baseUri, requestUri, New StringContent(content, Encoding.UTF8, "application/json"), timeout, failedResponse, ignoreSslCertErrors)
End Function

Public Async Function PostJsonContent(baseUri As String, requestUri As String, content As HttpContent, Optional timeout As Integer = 15, Optional failedResponse As String = "", Optional ignoreSslCertErrors As Boolean = False) As Task(Of String)
    Dim httpResponse As HttpResponseMessage

    Using handler = New WebRequestHandler
        If ignoreSslCertErrors Then
            handler.ServerCertificateValidationCallback = New Security.RemoteCertificateValidationCallback(Function(sender, cert, chain, policyErrors) True)
        End If

        Using client = New HttpClient(handler)
            If Not String.IsNullOrWhiteSpace(baseUri) Then
                client.BaseAddress = New Uri(baseUri)
            End If

            client.DefaultRequestHeaders.Accept.Clear()
            client.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))
            client.Timeout = New TimeSpan(TimeSpan.FromSeconds(timeout).Ticks)

            httpResponse = Await client.PostAsync(requestUri, content)

            If httpResponse.IsSuccessStatusCode Then
                Dim response = Await httpResponse.Content.ReadAsStringAsync
                If Not String.IsNullOrWhiteSpace(response) Then
                    Return response
                End If
            End If
        End Using
    End Using

    Return failedResponse
End Function

0

หากคุณใช้ MVC แทน WebAPI คุณสามารถใช้ base.Content method:

return base.Content(result, "text/html", Encoding.UTF8);

-2

เราต้องพยายามที่จะไม่ส่งคืน html แต่เป็นข้อมูลบริสุทธิ์จาก API ของเราและจัดรูปแบบข้อมูลตามใน UI แต่บางทีคุณอาจใช้:

return this.Request.CreateResponse(HttpStatusCode.OK, 
     new{content=YourStringContent})

มันได้ผลสำหรับฉัน


6
การห่อบางสิ่งบางอย่างไว้ในวัตถุจำลองไม่ได้ทำให้บริสุทธิ์มากขึ้น หาก HTML เป็นข้อมูลของคุณก็ไม่มีเหตุผลที่จะซ่อนมัน
Jouni Heikniemi

แนวคิดของ web api คือการส่งคืนข้อมูลและปล่อยให้ UI เพิ่ม HTML ที่ต้องการบางทีเราอาจมีบางกรณีที่ข้อมูลเป็น HTML แต่ฉันคิดว่านั่นไม่ใช่บรรทัดฐาน
user1075679
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.