ส่งคืนสตริง JSON อย่างชัดเจนจาก Asp.net WEBAPI หรือไม่


88

ในบางกรณีฉันมี NewtonSoft JSON.NET และในคอนโทรลเลอร์ของฉันฉันเพิ่งคืน Jobject จากคอนโทรลเลอร์ของฉันและทุกอย่างก็ดี

แต่ฉันมีกรณีที่ฉันได้รับ JSON ดิบจากบริการอื่นและจำเป็นต้องส่งคืนจาก webAPI ของฉัน ในบริบทนี้ฉันไม่สามารถใช้ NewtonSOft ได้ แต่ถ้าทำได้ฉันจะสร้าง JOBJECT จากสตริง (ซึ่งดูเหมือนว่าเป็นค่าโสหุ้ยในการประมวลผลที่ไม่จำเป็น) และส่งคืนสิ่งนั้นและทุกอย่างจะเข้ากันได้ดีกับโลก

อย่างไรก็ตามฉันต้องการส่งคืนสิ่งนี้ง่ายๆ แต่ถ้าฉันส่งคืนสตริงไคลเอ็นต์จะได้รับ JSON wrapper พร้อมบริบทของฉันเป็นสตริงที่เข้ารหัส

ฉันจะส่งคืน JSON จากวิธีควบคุม WebAPI ของฉันอย่างชัดเจนได้อย่างไร

คำตอบ:


201

มีทางเลือกไม่กี่ทาง วิธีที่ง่ายที่สุดคือให้เมธอดของคุณส่งคืน a HttpResponseMessageและสร้างการตอบกลับนั้นโดยStringContentอิงตามสตริงของคุณซึ่งคล้ายกับโค้ดด้านล่าง:

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

และตรวจสอบสตริงว่างหรือ JSON ว่าง

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
ยอดเยี่ยม. ฉันกำลังสร้างสตริง JSON และส่งคืนเป็นสตริง แต่นั่นทำให้เกิดความพิเศษที่หลีกเลี่ยงไม่ได้ "รอบ ๆ ผลลัพธ์สิ่งนี้ควรแก้ไขได้
dumbledad

1
นี่มันน่ารำคาญ คุณต้องสร้างจริงHttpResponseMessage responseจากนั้นกำหนดStringContentให้กับ.Contentคุณสมบัติ ไม่ได้ผลถ้าคุณกำหนด StringContent ใน Constructor
Suamere

16

นี่คือโซลูชันของ @carlosfigueira ที่ปรับให้เข้ากับอินเทอร์เฟซ IHttpActionResult ที่เปิดตัวกับ 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

หากคุณต้องการส่งคืนเฉพาะ JSON นั้นโดยเฉพาะโดยไม่ต้องใช้คุณสมบัติ WebAPI (เช่นการอนุญาต XML) คุณสามารถเขียนลงในเอาต์พุตได้โดยตรง สมมติว่าคุณโฮสต์สิ่งนี้ด้วย ASP.NET คุณสามารถเข้าถึงResponseวัตถุได้ดังนั้นคุณสามารถเขียนออกมาเป็นสตริงได้จากนั้นคุณไม่จำเป็นต้องส่งคืนอะไรจากวิธีการของคุณ - คุณได้เขียนแล้ว ข้อความตอบกลับไปยังสตรีมเอาต์พุต


1

ตัวอย่างตัวอย่างเพื่อส่งคืนข้อมูล json จากวิธี web api GET

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

2
เนื้อหามาจากไหน? ชื่อแบบเต็มหรือคำสั่ง "ใช้" จะเป็นประโยชน์
granadaCoder

0

สิ่งเหล่านี้ยังใช้งานได้:

[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

สิ่งนี้ใช้ได้กับฉันใน. 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);
}

ContentResultคือMicrosoft.AspNetCore.Mvc.ContentResult.

โปรดทราบว่านี่ไม่ใช่ส่วนหัวของช่อง แต่ในกรณีของฉันนี่คือสิ่งที่ฉันต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.