1
Get["/"] = _ =>"some data";
Post["/"] = _ =>new {detail="detail.."};

応答をこの形式に変換する必要があります

{
   state: state code
   data: origin data
}

だから、アフターフックを追加します

After.AddItemToEndOfPipeline(ResponseFormatHook);
...
private void ResponseFormatHook(NancyContext ctx)
{
    var apiResponse = new APIResponse();
    apiResponse.State = ctx.Response.StatusCode;

    using(var stream = new MemoryStream())
    {
        ctx.Response.Contents.Invoke(stream);
        stream.Position = 0;
        using (var reader = new StreamReader(stream))
        {
            // get the origin data
            var content = reader.ReadToEnd();
            apiResponse.Data = content;
        }
    }

    var response = new JsonResponse(apiResponse, new DefaultJsonSerializer());
    response.StatusCode = HttpStatusCode.OK;

    ctx.Response = response;
}

のためGet["/"]に、それは大丈夫です。戻り{state:200,data:"some data"}ます。

しかし、 forPost["/"]が返され{state:200,data:"{detail:\"detail..\"}"}ます。データはオブジェクトではなく文字列に変換されます。クライアントは一度に逆シリアル化できません。

では、元のデータを取得するにはどうすればよいでしょうか。

apiResponse.Data=OriginData、これでOKです。

編集1

たぶん、次のようにデータを逆シリアル化できます

apiResponse.Data=JsonConvert.Deserialize(apiResponse.Data).

しかし、これは高すぎると思いますね。

4

1 に答える 1

1

使用IResponseProcessorは元のデータに触れます。

public class APIResponseProcessor : IResponseProcessor
{
    private static readonly IEnumerable<Tuple<string, MediaRange>> extensionMappings =
        new[] {new Tuple<string, MediaRange>("json", MediaRange.FromString("application/json"))};

    public ProcessorMatch CanProcess(MediaRange requestedMediaRange, dynamic model, NancyContext context)
    {
        var match = new ProcessorMatch();
        match.ModelResult = MatchResult.DontCare;
        match.RequestedContentTypeResult = MatchResult.ExactMatch;

        return match;
    }

    public Response Process(MediaRange requestedMediaRange, dynamic model, NancyContext context)
    {
        var apiResponse = new APIResponse();
        apiResponse.Data = model;

        return new JsonResponse(apiResponse,new DefaultJsonSerializer());
    }

    public IEnumerable<Tuple<string, MediaRange>> ExtensionMappings { get { return extensionMappings; } }
}

After フックの代わりにプロセッサを使用します。

于 2013-11-14T16:04:58.630 に答える