Devolviendo una cadena que contiene Json válida con Nancy
(4)
Esto también funciona:
Response.AsText(myJsonString, "application/json");
Recibo una cadena que contiene JSON válido de otro servicio. Me gustaría simplemente reenviar esta cadena con Nancy, pero también establecer el tipo de contenido en "application / json" que me permitirá eliminar la necesidad de usar $ .parseJSON (datos) en el lado del cliente.
Si uso Response.AsJson, parece manipular el JSON en la cadena y agrega caracteres de escape. Podría crear un flujo con la cadena y establecer el tipo de respuesta algo así como:
Response test = new Response();
test.ContentType = "application/json";
test.Contents = new MemoryStream(Encoding.UTF8.GetBytes(myJsonString));
pero me gustaría saber si hay una manera más simple?
Más o menos de la manera en que lo haces. Podrías hacerlo
var response = (Response)myJsonString;
response.ContentType = "application/json";
Simplemente puede crear un método de extensión en IResponseFormatter y proporcionar su propio asistente AsXXXX. Con la versión 0.8 habrá algunas extensiones en la respuesta para que pueda hacer cosas como WithHeader (..), WithStatusCode () etc-
Me gusta que pienses que debería haber una mejor manera porque tienes que usar 3 líneas de código, creo que eso dice algo sobre Nancy :-)
No puedo pensar en una "mejor" forma de hacerlo, puedes hacerlo de la manera GetBytes:
Get["/"] = _ =>
{
var jsonBytes = Encoding.UTF8.GetBytes(myJsonString);
return new Response
{
ContentType = "application/json",
Contents = s => s.Write(jsonBytes, 0, jsonBytes.Length)
};
};
O el modo "lanzar una cuerda":
Get["/"] = _ =>
{
var response = (Response)myJsonString;
response.ContentType = "application/json";
return response;
};
Ambos hacen lo mismo: el último es menos código, el primero es más descriptivo (imo).
Parece que Nancy tiene un buen método de extensión Response.AsJson:
Get["/providers"] = _ =>
{
var providers = this.interactiveDiagnostics
.AvailableDiagnostics
.Select(p => new { p.Name, p.Description, Type = p.GetType().Name, p.GetType().Namespace, Assembly = p.GetType().Assembly.GetName().Name })
.ToArray();
return Response.AsJson(providers);
};