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>

वहाँ भी एक शुद्ध, बिना पाठ के लौटने के लिए एक तरीका है आसपास के XML टैग (शायद एक अलग वापसी प्रकार एक्शन विशेषता) के बिना?

जवाबों:


223

आपके पास आपकी वेब एपी कार्रवाई हो सकती है 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 में सेट करूं तो यह काम करेगा?
'21:

5
नहीं, यह काम नहीं करेगा। वेब एपीआई में एक्सएमएल और जेएसएन फॉर्मेटर्स बिल्ट-इन हैं। बाकी सब कुछ के लिए आपको अपने स्वयं के फ़ॉर्मैटर का निर्माण करना होगा या अपने तरीकों से कच्चे HttpResponseMessages को वापस करना होगा जैसा कि मेरे उत्तर में दिखाया गया है।
डारिन दिमित्रोव

HttpResponseMessage System.Net.Http नाम स्थान पर स्थित है।
जेम्स लॉरुक

8

एक और संभव उपाय। वेब एपीआई 2 में मैंने आधार का इस्तेमाल किया है। कंटेंट () विधि APIController:

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

मुझे इसे IE9 बग के आसपास लाने के लिए ऐसा करने की आवश्यकता थी जहां यह JSON सामग्री को डाउनलोड करने का प्रयास करता रहे। XmlMediaTypeFormatterमीडिया फॉर्मेट का उपयोग करके XML- टाइप डेटा के लिए भी काम करना चाहिए ।

आशा है कि किसी की मदद करता है।


ओपी एक 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

यदि आप WebAPI के बजाय MVC का उपयोग कर रहे हैं, तो आप आधार का उपयोग कर सकते हैं। सहज विधि:

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

-2

हमें UI के अनुसार html लेकिन शुद्ध डेटा को वापस करने का प्रयास नहीं करना चाहिए, लेकिन शायद आप इसका उपयोग कर सकते हैं:

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

इससे मेरा काम बनता है


6
किसी डमी वस्तु में कुछ लपेटने से वह अधिक शुद्ध नहीं हो जाती है। एचटीएमएल तो है आपके डेटा, वहाँ यह छुपा में कोई मतलब नहीं है।
जौनी हकीमनेई

वेब एपीआई का विचार डेटा वापस करना है, और आवश्यक HTML जोड़ने के लिए UI छोड़ दें, हो सकता है कि हमारे पास कुछ ऐसे मामले हों जहां डेटा HTML हो, लेकिन मुझे लगता है कि यह आदर्श नहीं है।
user1075679
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.