Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Shopify Create a new product with multiple product variants

See more Shopify Examples

Create a new product with multiple product variants

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.StringBuilder,
  Chilkat.Rest,
  Chilkat.JsonObject;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  rest: TRest;
  jsonReq: TJsonObject;
  sbReq: TStringBuilder;
  sbJson: TStringBuilder;
  json: TJsonObject;
  productId: Integer;
  productTitle: string;
  productBody_html: string;
  productVendor: string;
  productProduct_type: string;
  productCreated_at: string;
  productHandle: string;
  productUpdated_at: string;
  productPublished_at: string;
  productTemplate_suffix: Boolean;
  productPublished_scope: string;
  productTags: string;
  productImage: Boolean;
  i: Integer;
  count_i: Integer;
  id: Integer;
  product_id: Integer;
  title: string;
  price: string;
  sku: string;
  position: Integer;
  grams: Integer;
  inventory_policy: string;
  compare_at_price: Boolean;
  fulfillment_service: string;
  inventory_management: Boolean;
  option1: string;
  option2: Boolean;
  option3: Boolean;
  created_at: string;
  updated_at: string;
  taxable: Boolean;
  barcode: Boolean;
  image_id: Boolean;
  inventory_quantity: Integer;
  weight: Integer;
  weight_unit: string;
  old_inventory_quantity: Integer;
  requires_shipping: Boolean;
  name: string;
  j: Integer;
  count_j: Integer;
  strVal: string;

begin
  success := False;

  rest := TRest.Create;

  rest.SetAuthBasic('SHOPIFY_PRIVATE_API_KEY','SHOPIFY_PRIVATE_API_KEY');

  success := rest.Connect('chilkat.myshopify.com',443,True,True);
  if (success <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  //  The following code creates the JSON request body.
  //  The JSON created by this code is shown below.
  jsonReq := TJsonObject.Create;
  jsonReq.UpdateString('product.title','Burton Custom Freestyle 151');
  jsonReq.UpdateString('product.body_html','<strong>Good snowboard!</strong>');
  jsonReq.UpdateString('product.vendor','Burton');
  jsonReq.UpdateString('product.product_type','Snowboard');
  jsonReq.UpdateString('product.variants[0].option1','First');
  jsonReq.UpdateString('product.variants[0].price','10.00');
  jsonReq.UpdateString('product.variants[0].sku','123');
  jsonReq.UpdateString('product.variants[1].option1','Second');
  jsonReq.UpdateString('product.variants[1].price','20.00');
  jsonReq.UpdateString('product.variants[1].sku','123');

  //  The JSON request body created by the above code:

  //  {
  //    "product": {
  //      "title": "Burton Custom Freestyle 151",
  //      "body_html": "<strong>Good snowboard!<\/strong>",
  //      "vendor": "Burton",
  //      "product_type": "Snowboard",
  //      "variants": [
  //        {
  //          "option1": "First",
  //          "price": "10.00",
  //          "sku": "123"
  //        },
  //        {
  //          "option1": "Second",
  //          "price": "20.00",
  //          "sku": "123"
  //        }
  //      ]
  //    }
  //  }

  sbReq := TStringBuilder.Create;
  jsonReq.EmitSb(sbReq);

  rest.AddHeader('Content-Type','application/json');

  sbJson := TStringBuilder.Create;
  success := rest.FullRequestSb('POST','/admin/products.json ',sbReq,sbJson);
  if (success <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  if (rest.ResponseStatusCode <> 201) then
    begin
      WriteLn('Received error response code: ' + rest.ResponseStatusCode);
      WriteLn('Response body:');
      WriteLn(sbJson.GetAsString());
      Exit;
    end;

  json := TJsonObject.Create;
  json.LoadSb(sbJson);

  //  The following code parses the JSON response.
  //  A sample JSON response is shown below the sample code.

  productId := json.IntOf('product.id');
  productTitle := json.StringOf('product.title');
  productBody_html := json.StringOf('product.body_html');
  productVendor := json.StringOf('product.vendor');
  productProduct_type := json.StringOf('product.product_type');
  productCreated_at := json.StringOf('product.created_at');
  productHandle := json.StringOf('product.handle');
  productUpdated_at := json.StringOf('product.updated_at');
  productPublished_at := json.StringOf('product.published_at');
  productTemplate_suffix := json.IsNullOf('product.template_suffix');
  productPublished_scope := json.StringOf('product.published_scope');
  productTags := json.StringOf('product.tags');
  productImage := json.IsNullOf('product.image');
  i := 0;
  count_i := json.SizeOfArray('product.variants');
  while i < count_i do
    begin
      json.I := i;
      id := json.IntOf('product.variants[i].id');
      product_id := json.IntOf('product.variants[i].product_id');
      title := json.StringOf('product.variants[i].title');
      price := json.StringOf('product.variants[i].price');
      sku := json.StringOf('product.variants[i].sku');
      position := json.IntOf('product.variants[i].position');
      grams := json.IntOf('product.variants[i].grams');
      inventory_policy := json.StringOf('product.variants[i].inventory_policy');
      compare_at_price := json.IsNullOf('product.variants[i].compare_at_price');
      fulfillment_service := json.StringOf('product.variants[i].fulfillment_service');
      inventory_management := json.IsNullOf('product.variants[i].inventory_management');
      option1 := json.StringOf('product.variants[i].option1');
      option2 := json.IsNullOf('product.variants[i].option2');
      option3 := json.IsNullOf('product.variants[i].option3');
      created_at := json.StringOf('product.variants[i].created_at');
      updated_at := json.StringOf('product.variants[i].updated_at');
      taxable := json.BoolOf('product.variants[i].taxable');
      barcode := json.IsNullOf('product.variants[i].barcode');
      image_id := json.IsNullOf('product.variants[i].image_id');
      inventory_quantity := json.IntOf('product.variants[i].inventory_quantity');
      weight := json.IntOf('product.variants[i].weight');
      weight_unit := json.StringOf('product.variants[i].weight_unit');
      old_inventory_quantity := json.IntOf('product.variants[i].old_inventory_quantity');
      requires_shipping := json.BoolOf('product.variants[i].requires_shipping');
      i := i + 1;
    end;

  i := 0;
  count_i := json.SizeOfArray('product.options');
  while i < count_i do
    begin
      json.I := i;
      id := json.IntOf('product.options[i].id');
      product_id := json.IntOf('product.options[i].product_id');
      name := json.StringOf('product.options[i].name');
      position := json.IntOf('product.options[i].position');
      j := 0;
      count_j := json.SizeOfArray('product.options[i].values');
      while j < count_j do
        begin
          json.J := j;
          strVal := json.StringOf('product.options[i].values[j]');
          j := j + 1;
        end;

      i := i + 1;
    end;

  i := 0;
  count_i := json.SizeOfArray('product.images');
  while i < count_i do
    begin
      json.I := i;
      i := i + 1;
    end;

  //  A sample JSON response body that is parsed by the above code:

  //  {
  //    "product": {
  //      "id": 1071559755,
  //      "title": "Burton Custom Freestyle 151",
  //      "body_html": "<strong>Good snowboard!<\/strong>",
  //      "vendor": "Burton",
  //      "product_type": "Snowboard",
  //      "created_at": "2017-09-22T14:48:54-04:00",
  //      "handle": "burton-custom-freestyle-151",
  //      "updated_at": "2017-09-22T14:48:55-04:00",
  //      "published_at": "2017-09-22T14:48:54-04:00",
  //      "template_suffix": null,
  //      "published_scope": "global",
  //      "tags": "",
  //      "variants": [
  //        {
  //          "id": 1070325225,
  //          "product_id": 1071559755,
  //          "title": "First",
  //          "price": "10.00",
  //          "sku": "123",
  //          "position": 1,
  //          "grams": 0,
  //          "inventory_policy": "deny",
  //          "compare_at_price": null,
  //          "fulfillment_service": "manual",
  //          "inventory_management": null,
  //          "option1": "First",
  //          "option2": null,
  //          "option3": null,
  //          "created_at": "2017-09-22T14:48:54-04:00",
  //          "updated_at": "2017-09-22T14:48:54-04:00",
  //          "taxable": true,
  //          "barcode": null,
  //          "image_id": null,
  //          "inventory_quantity": 1,
  //          "weight": 0.0,
  //          "weight_unit": "lb",
  //          "old_inventory_quantity": 1,
  //          "requires_shipping": true
  //        },
  //        {
  //          "id": 1070325226,
  //          "product_id": 1071559755,
  //          "title": "Second",
  //          "price": "20.00",
  //          "sku": "123",
  //          "position": 2,
  //          "grams": 0,
  //          "inventory_policy": "deny",
  //          "compare_at_price": null,
  //          "fulfillment_service": "manual",
  //          "inventory_management": null,
  //          "option1": "Second",
  //          "option2": null,
  //          "option3": null,
  //          "created_at": "2017-09-22T14:48:54-04:00",
  //          "updated_at": "2017-09-22T14:48:54-04:00",
  //          "taxable": true,
  //          "barcode": null,
  //          "image_id": null,
  //          "inventory_quantity": 1,
  //          "weight": 0.0,
  //          "weight_unit": "lb",
  //          "old_inventory_quantity": 1,
  //          "requires_shipping": true
  //        }
  //      ],
  //      "options": [
  //        {
  //          "id": 1022828915,
  //          "product_id": 1071559755,
  //          "name": "Title",
  //          "position": 1,
  //          "values": [
  //            "First",
  //            "Second"
  //          ]
  //        }
  //      ],
  //      "images": [
  //      ],
  //      "image": null
  //    }
  //  }

  WriteLn('Example Completed.');


  rest.Free;
  jsonReq.Free;
  sbReq.Free;
  sbJson.Free;
  json.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.