Artikel über eine JSON Liste (Array) Updaten REST -API PUT

Hallo Ihr,

ich möchte meine Artikel aus der Warenwirtschaft (Bestände und Preise) über die REST - API updaten. Das ganze funktioniert auch wunderbar wenn ich jeden Artikel einzeln übergebe.

Was ich aus Laufzeitgründen jedoch eigentlich möchte ist, dass ich mir ein JSON Array (Alle Artikel) zusammenbaue und diesen dann übertrage. Das Zusammenstellen des JSON habe ich gelöst jedoch bekomme ich immer eine Fehlermeldung wenn ich das JSON Array hochladen möchte.

 

        RestRequest requestput = new RestRequest(“variants”, Method.PUT);
        requestput.AddJsonBody(variant); //Variant ist das Objekt mit den gesamten Artikeln
        var updateArt = client.Execute(requestput);

 

“StatusCode: OK, Content-Type: application/json, Content-Length: -1)”

"{\"success\":true,\"data\":{\"data\":{\"success\":false,\"message\":\"\",\"trace\":\"#0 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Components\\/Api\\/Resource\\/Resource.php(527): Shopware\\\\Components\\\\Api\\\\Resource\\\\Variant->create(Array)\\n#1 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Controllers\\/Api\\/Rest.php(78): Shopware\\\\Components\\\\Api\\\\Resource\\\\Resource->batch(Array)\\n#2 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Library\\/Enlight\\/Controller\\/Action.php(158): Shopware_Controllers_Api_Rest->batchAction()\\n#3 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Library\\/Enlight\\/Controller\\/Dispatcher\\/Default.php(523): Enlight_Controller_Action->dispatch('batchAction')\\n#4 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Library\\/Enlight\\/Controller\\/Front.php(226): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp))\\n#5 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Kernel.php(153): Enlight_Controller_Front->dispatch()\\n#6 \\/scaxflvs\\/www.SHOPURL.de\\/vendor\\/symfony\\/http-kernel\\/HttpCache\\/HttpCache.php(492): Shopware\\\\Kernel->handle(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), 1, true)\\n#7 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Components\\/HttpCache\\/AppCache.php(255): Symfony\\\\Component\\\\HttpKernel\\\\HttpCache\\\\HttpCache->forward(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true, NULL)\\n#8 \\/scaxflvs\\/www.SHOPURL.de\\/vendor\\/symfony\\/http-kernel\\/HttpCache\\/HttpCache.php(263): Shopware\\\\Components\\\\HttpCache\\\\AppCache->forward(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true)\\n#9 \\/scaxflvs\\/www.SHOPURL.de\\/vendor\\/symfony\\/http-kernel\\/HttpCache\\/HttpCache.php(280): Symfony\\\\Component\\\\HttpKernel\\\\HttpCache\\\\HttpCache->pass(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true)\\n#10 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Components\\/HttpCache\\/AppCache.php(133): Symfony\\\\Component\\\\HttpKernel\\\\HttpCache\\\\HttpCache->invalidate(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true)\\n#11 \\/scaxflvs\\/www.SHOPURL.de\\/vendor\\/symfony\\/http-kernel\\/HttpCache\\/HttpCache.php(209): Shopware\\\\Components\\\\HttpCache\\\\AppCache->invalidate(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true)\\n#12 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Components\\/HttpCache\\/AppCache.php(114): Symfony\\\\Component\\\\HttpKernel\\\\HttpCache\\\\HttpCache->handle(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), 1, true)\\n#13 \\/scaxflvs\\/www.SHOPURL.de\\/shopware.php(101): Shopware\\\\Components\\\\HttpCache\\\\AppCache->handle(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request))\\n#14 {main}\"},\"total\":{\"success\":false,\"message\":\"\",\"trace\":\"#0 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Components\\/Api\\/Resource\\/Resource.php(527): Shopware\\\\Components\\\\Api\\\\Resource\\\\Variant->create(0)\\n#1 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Controllers\\/Api\\/Rest.php(78): Shopware\\\\Components\\\\Api\\\\Resource\\\\Resource->batch(Array)\\n#2 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Library\\/Enlight\\/Controller\\/Action.php(158): Shopware_Controllers_Api_Rest->batchAction()\\n#3 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Library\\/Enlight\\/Controller\\/Dispatcher\\/Default.php(523): Enlight_Controller_Action->dispatch('batchAction')\\n#4 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Library\\/Enlight\\/Controller\\/Front.php(226): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp))\\n#5 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Kernel.php(153): Enlight_Controller_Front->dispatch()\\n#6 \\/scaxflvs\\/www.SHOPURL.de\\/vendor\\/symfony\\/http-kernel\\/HttpCache\\/HttpCache.php(492): Shopware\\\\Kernel->handle(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), 1, true)\\n#7 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Components\\/HttpCache\\/AppCache.php(255): Symfony\\\\Component\\\\HttpKernel\\\\HttpCache\\\\HttpCache->forward(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true, NULL)\\n#8 \\/scaxflvs\\/www.SHOPURL.de\\/vendor\\/symfony\\/http-kernel\\/HttpCache\\/HttpCache.php(263): Shopware\\\\Components\\\\HttpCache\\\\AppCache->forward(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true)\\n#9 \\/scaxflvs\\/www.SHOPURL.de\\/vendor\\/symfony\\/http-kernel\\/HttpCache\\/HttpCache.php(280): Symfony\\\\Component\\\\HttpKernel\\\\HttpCache\\\\HttpCache->pass(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true)\\n#10 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Components\\/HttpCache\\/AppCache.php(133): Symfony\\\\Component\\\\HttpKernel\\\\HttpCache\\\\HttpCache->invalidate(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true)\\n#11 \\/scaxflvs\\/www.SHOPURL.de\\/vendor\\/symfony\\/http-kernel\\/HttpCache\\/HttpCache.php(209): Shopware\\\\Components\\\\HttpCache\\\\AppCache->invalidate(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true)\\n#12 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Components\\/HttpCache\\/AppCache.php(114): Symfony\\\\Component\\\\HttpKernel\\\\HttpCache\\\\HttpCache->handle(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), 1, true)\\n#13 \\/scaxflvs\\/www.SHOPURL.de\\/shopware.php(101): Shopware\\\\Components\\\\HttpCache\\\\AppCache->handle(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request))\\n#14 {main}\"},\"success\":{\"success\":false,\"message\":\"\",\"trace\":\"#0 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Components\\/Api\\/Resource\\/Resource.php(527): Shopware\\\\Components\\\\Api\\\\Resource\\\\Variant->create(false)\\n#1 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Controllers\\/Api\\/Rest.php(78): Shopware\\\\Components\\\\Api\\\\Resource\\\\Resource->batch(Array)\\n#2 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Library\\/Enlight\\/Controller\\/Action.php(158): Shopware_Controllers_Api_Rest->batchAction()\\n#3 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Library\\/Enlight\\/Controller\\/Dispatcher\\/Default.php(523): Enlight_Controller_Action->dispatch('batchAction')\\n#4 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Library\\/Enlight\\/Controller\\/Front.php(226): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp))\\n#5 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Kernel.php(153): Enlight_Controller_Front->dispatch()\\n#6 \\/scaxflvs\\/www.SHOPURL.de\\/vendor\\/symfony\\/http-kernel\\/HttpCache\\/HttpCache.php(492): Shopware\\\\Kernel->handle(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), 1, true)\\n#7 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Components\\/HttpCache\\/AppCache.php(255): Symfony\\\\Component\\\\HttpKernel\\\\HttpCache\\\\HttpCache->forward(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true, NULL)\\n#8 \\/scaxflvs\\/www.SHOPURL.de\\/vendor\\/symfony\\/http-kernel\\/HttpCache\\/HttpCache.php(263): Shopware\\\\Components\\\\HttpCache\\\\AppCache->forward(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true)\\n#9 \\/scaxflvs\\/www.SHOPURL.de\\/vendor\\/symfony\\/http-kernel\\/HttpCache\\/HttpCache.php(280): Symfony\\\\Component\\\\HttpKernel\\\\HttpCache\\\\HttpCache->pass(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true)\\n#10 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Components\\/HttpCache\\/AppCache.php(133): Symfony\\\\Component\\\\HttpKernel\\\\HttpCache\\\\HttpCache->invalidate(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true)\\n#11 \\/scaxflvs\\/www.SHOPURL.de\\/vendor\\/symfony\\/http-kernel\\/HttpCache\\/HttpCache.php(209): Shopware\\\\Components\\\\HttpCache\\\\AppCache->invalidate(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), true)\\n#12 \\/scaxflvs\\/www.SHOPURL.de\\/engine\\/Shopware\\/Components\\/HttpCache\\/AppCache.php(114): Symfony\\\\Component\\\\HttpKernel\\\\HttpCache\\\\HttpCache->handle(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request), 1, true)\\n#13 \\/scaxflvs\\/www.SHOPURL.de\\/shopware.php(101): Shopware\\\\Components\\\\HttpCache\\\\AppCache->handle(Object(Symfony\\\\Component\\\\HttpFoundation\\\\Request))\\n#14 {main}\"}}}"

 

Hier ist noch mein JSON

{
	application/json={
		"data": [{
			"id": 774,
			"number": "873110830",
			"active": 1,
			"inStock": 500,
			"prices": [{
				"customerGroupKey": "EK",
				"price": 0,
				"basePrice": 0
			}]
		},
		{
			"id": 776,
			"number": "873110835",
			"active": 1,
			"inStock": -90,
			"prices": [{
				"customerGroupKey": "EK",
				"price": 0,
				"basePrice": 0
			}]
		}],
		"total": 0,
		"success": false
	}
}

 

Soweit mir bekannt unterstützt der Artikel Endpunkt kein Batch Update. Somit musst du wohl jeden einzeln machen.

Viele Grüße,

Thorsten

Hallo Thorsten,

ich hatte mir dieses hier angeschaut und war der Meinung das es gehen sollte. Was genau macht denn Batch hier aus? Ich habe ja versucht ohne eine ID also nur über variants oder articles einen PUT auszuführen.

https://developers.shopware.com/developers-guide/rest-api/

Ich erstelle ja eigentlich nichts anderes als eine Liste von Objekten die ich dann über

   private void Getallarticlefromshop()
    {
      var client = startconnection();
      var request = new RestRequest("variants", Method.GET);
      request.AddHeader("Content-Type", "application/json; charset=utf-8");
      var response = client.Execute(request);

      try
      {
        var deserializedRootFromRoot = JsonConvert.DeserializeObject(response.Content);
        VariantsResponse variant = new VariantsResponse();
        variant.data = new List();
        var i = 0;
        foreach (var articles in deserializedRootFromRoot.data)
        {
          
          var nummer = articles.number;
          var id = articles.id;
          var artikelid = GetArtikelIdByArtikelNummer(nummer, ShopLagernummer);
          if (artikelid > 0)
          {
            i++;
            variant.data.Add(PutArticleStock(client, URL, System.Convert.ToString(nummer), artikelid,id));
          }
        }
        var clientput = startconnection();
        RestRequest requestput = new RestRequest("variants", Method.PUT);

        requestput.AddJsonBody(variant) ;
        
        var updateArt = clientput.Execute(requestput);


      }
      catch (Exception ex)
      {
        A.eins.Show(ex);
      }

    }

   private VariantsData PutArticleStock(RestClient client, string URL, string number, int artikelid,int id)
    {
      VariantsData variant = new VariantsData();
      try
      {
        variant.number = number;       
        var ArtikelidBestand = GetArtikelIdByArtikelNummer(number, ShopLagernummerBestand);
        variant.inStock = D.Get(D.ExecuteScalar("select cast(AMIC_PHYSBESTAND(?,today(),0) as int)", ArtikelidBestand), 0);
        variant.active = 1;
        variant.id = id;
        // *******************************************************************************
        //Falls die Konstante withpriceupdate auf true steht werden nicht nur die Bestände sondern auch die Preise aktualisiert
        // *******************************************************************************
        if (withpriceupdate)
        {
          variant.prices = new List();
          variant.prices.Add(priceupdate(artikelid));
        }
        return variant;

      }
      catch (Exception ex)
      {
        A.eins.Show(ex);
        return variant;
      }

    }
    private VariantsPrice priceupdate(int artikelid)
    {
      VariantsPrice articleprice = new VariantsPrice();
      decimal artiprice = D.Get(D.ExecuteScalar("select p_PreisdesKunden(?,?,today(),1)artikelpreis", artikelid, KundIdShopKunde), (decimal)0.0);
      articleprice.price = System.Convert.ToDouble(artiprice);
      decimal artibaseprice = D.Get(D.ExecuteScalar("select p_PreisdesKunden(?,?,today(),2)artikelpreis", artikelid, KundIdShopKunde), (decimal)0.0);
      articleprice.basePrice = System.Convert.ToDouble(artibaseprice);
      articleprice.customerGroupKey = "EK";
      return articleprice;
    }

hochladen möchte.

    public class VariantsResponse
    {
      public IList data { get; set; }
      public int total { get; set; }
      public bool success { get; set; }
    }


  public class VariantsData
    {

      public int id { get; set; }
      //public int articleId { get; set; }
      //public int? unitId { get; set; }
      public string number { get; set; }
      //public string supplierNumber { get; set; }
      //public int? kind { get; set; }
      //public string additionalText { get; set; }
      public int active { get; set; }
      public int? inStock { get; set; }
     // public int? stockMin { get; set; }
     // public string weight { get; set; }
     // public string width { get; set; }
     // public string len { get; set; }
     // public string height { get; set; }
     // public string ean { get; set; }
     // public int position { get; set; }
     // public int minPurchase { get; set; }
     // public int? purchaseSteps { get; set; }
     // public int? maxPurchase { get; set; }
     // public string purchaseUnit { get; set; }
     // public string referenceUnit { get; set; }
     // public string packUnit { get; set; }
     // public bool shippingFree { get; set; }
     // public string releaseDate { get; set; }
     // public string shippingTime { get; set; }
      public List prices { get; set; }
      //public VariantsAttribute attribute { get; set; }
    }
    public class VariantsPrice
    {
      //public int id { get; set; }
      //public int articleId { get; set; }
      //public int articleDetailsId { get; set; }
      public string customerGroupKey { get; set; }
      //public int from { get; set; }
      //public string to { get; set; }
      public double price { get; set; }
      //public int pseudoPrice { get; set; }
      public double basePrice { get; set; }
      //public int percent { get; set; }
      //public CustomerGroup customerGroup { get; set; }
    }

 

Oh danke für den Link, dann habe ich das aus einer alten Quelle. Muss ich meinen Code auch mal aktualisieren :) 

Es sollte also möglich sein. Versuch es mal mit requestput.AddJsonBody(variant.data.ToArray()) ;

Was würde ich nur ohne dich machen :slight_smile:

Using System.Linq;

und dann

 requestput.AddJsonBody(variant.data.ToArray()) ;

Funktioniert bestens.

Danke Danke Danke