3

I am trying to post an array called categories using the BigCommerce API. I receive a response that my array [1] is an invalid Json array.

To test, go to https://developer.bigcommerce.com/console Products > create a new product.

Here is my code:

    public bool CreateNewProduct(string name, string sku, decimal price, decimal weight, List<string> categories = null, string type = "physical", string availability = "available")
    {
        HttpClientHandler handler = new HttpClientHandler();
        handler.Credentials = new NetworkCredential(username, api_key);
        handler.UseDefaultCredentials = true;
        HttpClient client = new HttpClient(handler)
        {
            BaseAddress = new Uri(baseUrl),
        };


        Dictionary<string, string> values = new Dictionary<string, string>();
        values.Add("name", name);
        values.Add("price", price.ToString());
        values.Add("weight", weight.ToString());
        values.Add("sku", sku);

        string cats = string.Empty;

        if (categories == null)
        {
            categories = new List<string>();
            categories.Add(GetAllCategories().FirstOrDefault().ID.ToString());
        }
        else
        {
            foreach (string theInt in categories)
            {
                cats += theInt + ",";
            }

            cats.Remove(cats.Length - 1);

        }

        values.Add("categories", "[1]");
        values.Add("type", type);
        values.Add("availability", availability);

        string userP = username + ":" + api_key;
        byte[] authBytes = Encoding.UTF8.GetBytes(userP).ToArray();
        client.DefaultRequestHeaders.Add("Authorization", "Basic " + Convert.ToBase64String(authBytes));
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        string url = "products.json";

        HttpResponseMessage response = client.PostAsJsonAsync(url, values).Result;
        if (response.IsSuccessStatusCode)
        {
            Product result = response.Content.ReadAsAsync<Product>().Result;
            if (result != null)
            {
                return true;
            }
        }

        return false;

    }

Here is my request:

POST xyz/api/v2/products.json HTTP/1.1
Authorization: Basic adf
Accept: application/json
Content-Type: application/json; charset=utf-8
Host: x
Content-Length: 132
Expect: 100-continue

{"name":"test product 1","price":"100","weight":"1","sku":"test111","categories":"[1]","type":"physical","availability":"available"}

Here is the response:

[{"status":400,"message":"The field 'categories' is invalid.","details":{"invalid_reason":"The provided value is not a valid array."}}]

1 Answer 1

1

If you want to send an array using the dictionary, use Dictionary<string, object> and add the array itself, like this.

values.Add("categories", new[] { 100, 101 });

That will post the JSON like "categories":[100,101], which is what you should send.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.