Trả lại một chuỗi JSON rõ ràng từ WEBAPI Asp.net?


85

Trong một số trường hợp, tôi có NewtonSoft JSON.NET và trong bộ điều khiển của mình, tôi chỉ trả lại Jobject từ bộ điều khiển của mình và tất cả đều tốt.

Nhưng tôi gặp trường hợp nhận được một số JSON thô từ một dịch vụ khác và cần trả lại nó từ webAPI của mình. Trong bối cảnh này, tôi không thể sử dụng NewtonSOft, nhưng nếu có thể thì tôi sẽ tạo một JOBJECT từ chuỗi (có vẻ như là chi phí xử lý không cần thiết) và trả về điều đó và tất cả sẽ ổn với thế giới.

Tuy nhiên, tôi muốn trả lại điều này một cách đơn giản, nhưng nếu tôi trả về chuỗi, thì khách hàng sẽ nhận được trình bao bọc JSON với ngữ cảnh của tôi là một chuỗi được mã hóa.

Làm cách nào để tôi có thể trả về JSON một cách rõ ràng từ phương thức bộ điều khiển WebAPI của mình?

Câu trả lời:


197

Có một số lựa chọn thay thế. Cách đơn giản nhất là đặt phương thức của bạn trả về a HttpResponseMessagevà tạo phản hồi đó với một StringContentdựa trên chuỗi của bạn, tương tự như đoạn mã dưới đây:

public HttpResponseMessage Get()
{
    string yourJson = GetJsonFromSomewhere();
    var response = this.Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json");
    return response;
}

Và kiểm tra chuỗi JSON rỗng hoặc rỗng

public HttpResponseMessage Get()
{
    string yourJson = GetJsonFromSomewhere();
    if (!string.IsNullOrEmpty(yourJson))
    {
        var response = this.Request.CreateResponse(HttpStatusCode.OK);
        response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json");
        return response;
    }
    throw new HttpResponseException(HttpStatusCode.NotFound);
}

4
Thông minh. Tôi đã thực hiện một chuỗi JSON và trở về nó như là một chuỗi nhưng điều đó không thể tránh khỏi giới thiệu thêm "xung quanh kết quả này nên khắc phục điều đó..
dumbledad

1
Thật là khó chịu. Bạn phải thực sự tạo HttpResponseMessage response, sau đó gán StringContentthuộc .Contenttính. Nó không hoạt động nếu bạn gán StringContent trong Constructor.
Suamere 15/02/18

15

Đây là giải pháp của @ carlosfigueira được điều chỉnh để sử dụng Giao diện IHttpActionResult đã được giới thiệu với WebApi2:

public IHttpActionResult Get()
{
    string yourJson = GetJsonFromSomewhere();
    if (string.IsNullOrEmpty(yourJson)){
        return NotFound();
    }
    var response = this.Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json");
    return ResponseMessage(response);
}

2

Nếu bạn chỉ muốn trả lại JSON đó một cách cụ thể mà không sử dụng các tính năng của WebAPI (như cho phép XML), bạn luôn có thể ghi trực tiếp vào đầu ra. Giả sử bạn đang lưu trữ Responsetệp này bằng ASP.NET, bạn có quyền truy cập vào đối tượng, vì vậy bạn có thể viết nó ra theo cách đó dưới dạng chuỗi, sau đó bạn không cần thực sự trả lại bất kỳ thứ gì từ phương thức của mình - bạn đã viết văn bản phản hồi cho luồng đầu ra.


1

ví dụ mẫu để trả về dữ liệu json từ phương thức GET của api web

[HttpGet]
public IActionResult Get()
{
            return Content("{\"firstName\": \"John\",  \"lastName\": \"Doe\", \"lastUpdateTimeStamp\": \"2018-07-30T18:25:43.511Z\",  \"nextUpdateTimeStamp\": \"2018-08-30T18:25:43.511Z\");
}

1
Nội dung đến từ đâu? một tên đủ điều kiện hoặc câu lệnh "using" sẽ hữu ích.
granadaCoder

0

những thứ này cũng hoạt động:

[HttpGet]
[Route("RequestXXX")]
public ActionResult RequestXXX()
{
    string error = "";
    try{
        _session.RequestXXX();
    }
    catch(Exception e)
    {
        error = e.Message;
    }
    return new JsonResult(new { error=error, explanation="An error happened"});
}

[HttpGet]
[Route("RequestXXX")]
public ActionResult RequestXXX()
{
    string error = "";
    try{
        _session.RequestXXX();
    }
    catch(Exception e)
    {
        error = e.Message;
    }
    return new JsonResult(error);
}

0

Điều này phù hợp với tôi trong .NET Core 3.1.

private async Task<ContentResult> ChannelCosmicRaysAsync(HttpRequestMessage request)
{
    // client is HttpClient
    using var response = await client.SendAsync(request).ConfigureAwait(false); 

    var responseContentString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

    Response.StatusCode = (int)response.StatusCode;
    return Content(responseContentString, "application/json");
}
public Task<ContentResult> X()
{
    var request = new HttpRequestMessage(HttpMethod.Post, url);
    (...)

    return ChannelCosmicRaysAsync(request);
}

ContentResultMicrosoft.AspNetCore.Mvc.ContentResult.

Xin lưu ý rằng đây không phải là tiêu đề kênh, nhưng trong trường hợp của tôi, đây là thứ tôi cần.

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.