Dylan Barter
Sep 6, 2023
  1529
(0 votes)

Optimizely Configured Commerce Custom POST API

Introduction

When creating custom API controllers for an Optimizely B2B project it’s possible you’ll want to create POST calls. Following the architecture of the base code you will likely have a controller that inherits from the BaseApiController and utilizes ExecuteAsync or Execute methods to map your parameters and results and run a service method.

What can sometimes go unnoticed is that any result you’d like to return from a POST call requires a populated “Uri” string field on your result model.  This is because the Optimizely BaseApiController will not return the API result model with the POST response if the model doesn’t have a Uri value or it is null or blank. See the code section below from the BaseApiController Execute method:

            if (this.Request.Method == HttpMethod.Post)
            {
                if (apiResult.Uri.IsBlank())
                {
                    return this.StatusCode(HttpStatusCode.Created);
                }

                return this.Created(apiResult.Uri, apiResult);
            }

You can see that without a Uri parameter on the apiResult object, the method will simply return a “Created” status code as the result and omit the actual apiResult object payload.  So, if you are seeing empty results from your custom POST method, it’s likely you have not properly set the Uri field and the object is being left off the response.  If your response model inherits from BaseModel, then it already has a Uri parameter and you simply need to set it, likely in your mapper.  Several of the Optimizely B2B API flows will set the Uri parameter in the mapper, like the AccountsV1 endpoint does in GetAccountMapper:

        public virtual AccountModel MapResult(
            AddAccountResult serviceResult,
            HttpRequestMessage request
        )
        {
            var accountModel = this.GetAccountMapper.MapResult(
                serviceResult.GetAccountResult,
                request
            );

            accountModel.Password = accountModel.IsGuest ? serviceResult.Password : string.Empty;
            accountModel.BillToId = serviceResult.BillTo.Id;
            accountModel.ShipToId = serviceResult.ShipTo.Id;

            accountModel.Uri = this.UrlHelper.Link(
                "AccountV1",
                new { accountid = Constants.WebApiCurrent },
                request
            );

            return accountModel;
        }

The Uri should accurately identify the way that object could be resourced.  In this case, the UrlHelper.Link method returns the Get Account method which includes the Account Id. 

Sep 06, 2023

Comments

Please login to comment.
Latest blogs
Forcing Lowercase URLs in Optimizely CMS During Auto-Translation

Learn how to fix uppercase and punctuation issues in Optimizely CMS 12 URL segments caused by LanguageManager auto-translation using a custom...

Stuart | Apr 2, 2026 |

Stott Robots Handler v7 for Optimizely CMS 13

Stott Robots Handler version 7 is now available for  Optimizely PaaS CMS 13 . This is includes updates to support the switch from a Site based...

Mark Stott | Apr 2, 2026

Automating Block Translations in Optimizely

Stop manual block-by-block translations. Learn how to use the TranslateOrCopyContentAreaChildrenBlockForTypes config to automate Optimizely CMS...

Stuart | Apr 1, 2026 |

How to Disable automatic indexing in Optimizely Search & Navigation

Learn how automatic event-based indexing works in Optimizely Search & Navigation and how you can temporarily disable it.

Tomas Hensrud Gulla | Apr 1, 2026 |