web-dev-qa-db-fra.com

Renvoyer une chaîne contenant Json valide avec Nancy

Je reçois une chaîne contenant du JSON valide d'un autre service. Je voudrais simplement transmettre cette chaîne avec Nancy, mais également définir le type de contenu sur "application/json", ce qui me permettra de supprimer le besoin d'utiliser $ .parseJSON (data) du côté client.

Si j'utilise Response.AsJson, il semble modifier le JSON dans la chaîne et ajouter des caractères d'échappement. Je pourrais créer un Stream avec la chaîne et définir le type de réponse quelque chose comme:

Response test = new Response();
test.ContentType = "application/json";
test.Contents = new MemoryStream(Encoding.UTF8.GetBytes(myJsonString)); 

mais aimerait savoir s'il existe un moyen plus simple?

47
Dave

J'aime que vous pensiez qu'il devrait y avoir un meilleur moyen parce que vous devez utiliser 3 lignes de code, je pense que cela en dit long sur Nancy :-)

Je ne peux pas penser à une "meilleure" façon de le faire, vous pouvez soit le faire de la manière GetBytes:

Get["/"] = _ =>
    {
        var jsonBytes = Encoding.UTF8.GetBytes(myJsonString);
        return new Response
            {
                ContentType = "application/json",
                Contents = s => s.Write(jsonBytes, 0, jsonBytes.Length)
            };
    };

Ou la façon de "lancer une chaîne":

Get["/"] = _ =>
    {
        var response = (Response)myJsonString;

        response.ContentType = "application/json";

        return response;
    };

Les deux font la même chose - le dernier est moins de code, le premier plus descriptif (imo).

54
Steven Robbins

On dirait que Nancy a une méthode d'extension Nice 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);
            };
73
Darius

Cela fonctionne également:

Response.AsText(myJsonString, "application/json");
18
djoyce

À peu près comme vous le faites. Vous pourriez faire

var response = (Response)myJsonString;
response.ContentType = "application/json";

Vous pouvez simplement créer une méthode d'extension sur IResponseFormatter et fournir votre propre assistant AsXXXX. Avec la version 0.8, il y aura des extensions sur la réponse elle-même afin que vous puissiez faire des choses comme WithHeader (..), WithStatusCode () etc-

7
TheCodeJunkie

Si toutes les routes de votre module renvoient une chaîne JSON, vous pouvez définir le type de contenu dans le crochet After pour toutes les routes à la fois:

Get["/"] = _ =>
{
    // ... 
    return myJsonString;
};

After += ctx =>
{
    ctx.Response.ContentType = "application/json";
};
1
Peter Kofler