2013-11-14 4 views
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"}.

Но для Post["/"], будет возвращен {state:200,data:"{detail:\"detail..\"}"}. Данные преобразуются в строку, не являющуюся объектом. Клиент не может десериализоваться сразу.

Итак, как я могу получить исходные данные?

apiResponse.Data=OriginData, все будет в порядке.

EDIT 1

Может быть, я могу десериализовать данных как

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

Но я думаю, что это слишком дорого, не так ли?

ответ

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; } } 
} 

Использовать процессор вместо после крючка.

Смежные вопросы