// WriteResponseObject writes the status code and response object to the HttpResponseWriter in // the specified context, in the format best suited based on the request. // // Goweb uses the WebCodecService to decide which codec to use when responding // see http://godoc.org/github.com/stretchr/codecs/services#WebCodecService for more information. // // This method should be used when the Goweb Standard Response Object does not satisfy the needs of // the API, but other Respond* methods are recommended. func (a *GowebAPIResponder) WriteResponseObject(ctx context.Context, status int, responseObject interface{}) error { service := a.GetCodecService() acceptHeader := ctx.HttpRequest().Header.Get("Accept") extension := ctx.FileExtension() hasCallback := len(ctx.QueryValue(CallbackParameter)) > 0 codec, codecError := service.GetCodecForResponding(acceptHeader, extension, hasCallback) if codecError != nil { return codecError } options := ctx.CodecOptions() // do we need to add some options? if _, exists := options[constants.OptionKeyClientCallback]; hasCallback && !exists { options[constants.OptionKeyClientCallback] = ctx.QueryValue(CallbackParameter) } output, marshalErr := service.MarshalWithCodec(codec, responseObject, options) if marshalErr != nil { return marshalErr } // use the HTTP responder to respond ctx.HttpResponseWriter().Header().Set("Content-Type", codec.ContentType()) // TODO: test me a.httpResponder.With(ctx, status, output) return nil }
// Responds to the Context with the specified status, data and errors. func (a *GowebAPIResponder) Respond(ctx context.Context, status int, data interface{}, errors []string) error { if data != nil { var dataErr error data, dataErr = codecs.PublicData(data, nil) if dataErr != nil { return dataErr } } // make the standard response object if (a.AlwaysEnvelopResponse && ctx.QueryValue("envelop") != "false") || ctx.QueryValue("envelop") == "true" { sro := map[string]interface{}{ a.StandardFieldStatusKey: status, } if data != nil { sro[a.StandardFieldDataKey] = data } if len(errors) > 0 { sro[a.StandardFieldErrorsKey] = errors } data = sro } // transform the object var transformErr error data, transformErr = a.TransformStandardResponseObject(ctx, data) if transformErr != nil { return transformErr } return a.WriteResponseObject(ctx, status, data) }