Bagaimana cara mengembalikan string mentah dengan ApiController?


125

Saya memiliki ApiController yang melayani XML / JSON, tetapi saya ingin salah satu tindakan saya mengembalikan HTML murni. Saya mencoba yang di bawah ini tetapi masih mengembalikan XML / JSON.

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

Inilah yang dikembalikan di atas:

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

Apakah ada cara untuk mengembalikan teks murni dan tidak lolos bahkan tanpa tag XML di sekitarnya (mungkin jenis atribut tindakan pengembalian yang berbeda)?

Jawaban:


223

Anda dapat meminta tindakan Api Web Anda mengembalikan yang HttpResponseMessagemana Anda memiliki kontrol penuh atas Kontennya. Dalam kasus Anda, Anda mungkin menggunakan StringContent dan menentukan tipe konten yang benar:

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

atau

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

Saya belum mencoba tetapi saya ingin tahu apakah saya akan mengatur tipe data ke html akan berfungsi?
adt

5
Tidak, itu tidak akan berhasil. API Web hanya memiliki format XML dan JSON yang sudah terpasang. Untuk yang lainnya, Anda harus membangun pemformat Anda sendiri atau mengembalikan HttpResponseMessages mentah dari metode Anda seperti yang ditunjukkan dalam jawaban saya.
Darin Dimitrov

HttpResponseMessage terletak di namespace System.Net.Http.
James Lawruk

8

Solusi lain yang mungkin. Di Web API 2 saya menggunakan metode base.Content () APIController:

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

Saya perlu melakukan ini untuk mengatasi bug IE9 yang terus mencoba mengunduh konten JSON. Ini juga harus bekerja untuk data tipe XML dengan menggunakan XmlMediaTypeFormattermedia formatter.

Harapan yang membantu seseorang.


OP meminta untuk mengembalikan string html .. di mana string tersebut? dan bagaimana JsonMediaTypeFormatter mengembalikan html?
joedotnot

4

Tidak return Ok(value)akan berhasil, itu akan diperlakukan sebagai IEnumerable<char>.

Sebaliknya gunakan return Ok(new { Value = value })atau simillar.


0

Saya memanggil metode pengontrol webapi2 berikut dari metode pengontrol 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

Saya menyebutnya dari rutinitas ini di server 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

Jika Anda menggunakan MVC daripada WebAPI, Anda dapat menggunakan metode base.Content:

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

-2

Kita harus berusaha untuk tidak mengembalikan html tetapi data murni dari API kita dan memformat data yang sesuai di UI, tetapi mungkin Anda dapat menggunakan:

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

itu berhasil untuk saya


6
Membungkus sesuatu dengan benda tiruan tidak membuatnya menjadi lebih murni. Jika HTML adalah data Anda, tidak ada gunanya menyembunyikannya.
Jouni Heikniemi

Ide dari web api adalah untuk mengembalikan data, dan meninggalkan UI untuk menambahkan HTML yang diperlukan, mungkin kita dapat memiliki beberapa kasus di mana datanya adalah HTML, tapi menurut saya itu bukan norma.
pengguna1075679
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.