Làm thế nào để trả về chuỗi thô với ApiControll?


125

Tôi có một ApiContoder phục vụ XML / JSON, nhưng tôi muốn một trong những hành động của mình trả về HTML thuần túy. Tôi đã thử dưới đây nhưng nó vẫn trả về XML / JSON.

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

Đây là những gì trả về ở trên:

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

Có cách nào để chỉ trả lại văn bản thuần túy, không bị che giấu mà không cần các thẻ XML xung quanh (có thể là một loại thuộc tính hành động trả về khác) không?

Câu trả lời:


223

Bạn có thể yêu cầu hành động Api trên web của bạn trả lại HttpResponseMessagecho bạn toàn quyền kiểm soát Nội dung. Trong trường hợp của bạn, bạn có thể sử dụng StringContent và chỉ định loại nội dung chính xác:

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

hoặc là

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

Tôi chưa thử nhưng tôi tự hỏi liệu tôi có đặt kiểu dữ liệu thành html không?
adt

5
Không, nó sẽ không hoạt động. API Web chỉ có sẵn các trình định dạng XML và JSON. Đối với mọi thứ khác, bạn sẽ phải xây dựng trình định dạng của riêng mình hoặc trả lại HTTPResponseMessages thô từ các phương thức của bạn như trong câu trả lời của tôi.
Darin Dimitrov

HttpResponseMessage nằm trong không gian tên System.Net.Http.
James Lawruk

8

Một giải pháp khả thi khác. Trong API Web 2 tôi đã sử dụng phương thức base.Content () của APIController:

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

Tôi cần phải làm điều này để khắc phục lỗi IE9 khi nó tiếp tục cố gắng tải xuống nội dung JSON. Điều này cũng sẽ hoạt động đối với dữ liệu kiểu XML bằng cách sử dụng trình XmlMediaTypeFormatterđịnh dạng phương tiện.

Hy vọng rằng sẽ giúp được ai đó.


OP đã yêu cầu trả về một chuỗi html .. một chuỗi như vậy ở đâu? và làm thế nào JsonMediaTypeFormatter có thể trả về html?
joedotnot

4

Chỉ cần return Ok(value)không làm việc, nó sẽ được coi là IEnumerable<char>.

Thay vào đó sử dụng return Ok(new { Value = value })hoặc simillar.


0

Tôi gọi phương thức bộ điều khiển webapi2 sau từ phương thức bộ điều khiển 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

Tôi gọi nó từ thói quen này trên máy chủ 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

Nếu bạn đang sử dụng MVC chứ không phải WebAPI, bạn có thể sử dụng phương thức base.Content:

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

-2

Chúng tôi phải cố gắng không trả lại dữ liệu html nhưng dữ liệu thuần túy từ API và dữ liệu định dạng phù hợp trong UI, nhưng có lẽ bạn có thể sử dụng:

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

nó làm việc cho tôi


6
Gói một cái gì đó trong một vật thể giả không làm cho nó tinh khiết hơn. Nếu HTML dữ liệu của bạn, sẽ không có ý nghĩa gì trong việc che giấu nó.
Jouni Heikniemi

Ý tưởng của api web là trả lại dữ liệu và rời khỏi UI để thêm HTML cần thiết, có thể chúng ta có thể có một số trường hợp dữ liệu là HTML, nhưng tôi nghĩ đó không phải là chuẩn mực.
dùng1075679
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.