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)?

TruMan1
sumber

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"
        )
    });
}
Darin Dimitrov
sumber
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.

garryp
sumber
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.

abatishchev
sumber
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
Liam
sumber
0

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

return base.Content(result, "text/html", Encoding.UTF8);
Cossens
sumber
-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

pengguna1075679
sumber
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