# Show a post In this chapter, you will implement a feature in your blogging application that enables users to retrieve individual blog posts by their unique ID. This ID is assigned to each blog post when it is created and stored on the blockchain. By adding this querying functionality, users will be able to easily retrieve specific blog posts by specifying their ID. ## Show post Let's implement the `ShowPost` keeper method that will be called when a user makes a query to the blockchain application, specifying the ID of the desired post. ```go title="x/blog/keeper/query_show_post.go" package keeper import ( "context" "blog/x/blog/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) func (k Keeper) ShowPost(goCtx context.Context, req *types.QueryShowPostRequest) (*types.QueryShowPostResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } ctx := sdk.UnwrapSDKContext(goCtx) post, found := k.GetPost(ctx, req.Id) if !found { return nil, sdkerrors.ErrKeyNotFound } return &types.QueryShowPostResponse{Post: post}, nil } ``` `ShowPost` is a function for retrieving a single post object from the blockchain's state. It takes in two arguments: a `context.Context` object called `goCtx` and a pointer to a `types.QueryShowPostRequest` object called `req`. It returns a pointer to a `types.QueryShowPostResponse` object and an `error`. The function first checks if the `req` argument is `nil`. If it is, it returns an `error` with the code `InvalidArgument` and the message "invalid request" using the `status.Error` function from the `google.golang.org/grpc/status` package. If the `req` argument is not `nil`, the function unwraps the `sdk.Context` object from the `context.Context` object using the `sdk.UnwrapSDKContext` function. It then retrieves a post object with the specified `Id` from the blockchain's state using the `GetPost` function, and checks if the post was found by checking the value of the `found` boolean variable. If the post was not found, it returns an error with the type `sdkerrors.ErrKeyNotFound`. If the post was found, the function creates a new `types.QueryShowPostResponse` object with the retrieved post object as a field, and returns a pointer to this object and a `nil` error. ## Modify `QueryShowPostResponse` Include the option `[(gogoproto.nullable) = false]` in the `post` field in the `QueryShowPostResponse` message to generate the field without a pointer. ```proto title="proto/blog/blog/query.proto" message QueryShowPostResponse { // highlight-next-line Post post = 1 [(gogoproto.nullable) = false]; } ``` Run the command to generate Go files from proto: ``` ignite generate proto-go ```