2016-11-27 36 views
6

Mam kilka usług, które już otrzymują ciąg json (nie obiekt), które muszą zostać zwrócone do klienta. Obecnie jestem tworzenia HttpResponseMessage wyraźnie i ustawienie jego Content właściwość ciąg json którym usługa otrzymuje:Web Api: zalecany sposób zwracania ciągu jsonów

var response = Request.CreateResponse(HttpStatusCode.OK); 
response.Content = new StringContent(jsonUtilizadores, Encoding.UTF8, "application/json"); 
return response; 

Teraz, czy istnieje lepszy sposób to zrobić z nowym IHttpActionResult? Użycie metody Content lub Ok kończy oblewanie ciągów json cudzysłowami, co nie jest tym, czego chcę.

Jakieś opinie?

Odpowiedz

8

Utwórz niestandardową implementację. Struktura jest rozszerzalna poprzez IHttpActionResult.

Poniższa tworzy wynik zwyczaj i metodę rozszerzenia ...

public static class JsonStringResultExtension { 
    public static CustomJsonStringResult JsonString(this ApiController controller, string jsonContent, HttpStatusCode statusCode = HttpStatusCode.OK) { 
     var result = new CustomJsonStringResult(controller.Request, statusCode, jsonContent); 
     return result; 
    } 

    public class CustomJsonStringResult : IHttpActionResult { 
     private string json; 
     private HttpStatusCode statusCode; 
     private HttpRequestMessage request; 

     public CustomJsonStringResult(HttpRequestMessage httpRequestMessage, HttpStatusCode statusCode = HttpStatusCode.OK, string json = "") { 
      this.request = httpRequestMessage; 
      this.json = json; 
      this.statusCode = statusCode; 
     } 

     public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) { 
      return Task.FromResult(Execute()); 
     } 

     private HttpResponseMessage Execute() { 
      var response = request.CreateResponse(statusCode); 
      response.Content = new StringContent(json, Encoding.UTF8, "application/json"); 
      return response; 
     } 
    } 
} 

... które mogą być następnie stosowane do ApiController klas pochodnych. Znacznie upraszcza poprzednich wywołań

return this.JsonString(jsonUtilizadores); //defaults to 200 OK 

lub żądany kod stanu HTTP

return this.JsonString(jsonUtilizadores, HttpStatusCode.BadRequest); 
+1

najmniej zawikłana odpowiedź, którą znalazłem - nie wiem, dlaczego nie jest to bardziej popularne. Dzięki – Andy

4

Ustaw Api Web, aby powrócić JSON Format:

public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 
     // Force to ignore Request Content Type Header and reply only JSON 
     config.Formatters.Clear(); 
     config.Formatters.Add(new JsonMediaTypeFormatter()); 

     var corsAttr = new EnableCorsAttribute("*", "*", "*"); 
     config.EnableCors(corsAttr); 
    } 

a następnie powrócić odpowiedź tak:

 [HttpGet] 
    [Route("{taskId}/list")] 
    public IHttpActionResult GetTaskDocuments(string taskId) 
    { 
     var docs = repository.getTaskDocuments(taskId); 
     if (docs != null) 
     { 
      return Ok(docs); 
     } 
     else 
     { 
      return Ok(new ResponseStatus() { Status = Constants.RESPONSE_FAIL, Message = repository.LastErrorMsg }); 
     } 
    } 

Gdzie ResponseStatus jest następna klasa:

public class ResponseStatus 
    { 
     public string Status { get; set; } 
     public string Message { get; set; } 
    } 
2

Zostaw format odpowiedzi do negocjacji zawartości, aby być zgodna REST, klient powinien zdecydować, jaki format chce.

W swojej internetowej akcji API powinieneś po prostu zwrócić Ok(your object), a web API zobaczy, jaki jest najlepszy format, aby go zwrócić.

Jeśli chcesz pominąć inne formatery, po prostu usuń inne obiekty MediaTypeFormatter, tak jak radził Nkosi.