Shopware 5 mit Restsharp PUT Article

Hallo Ihr,

ich bin neu und grüße erst einmal alle die das hier sehen :slight_smile:

Ich habe eine Frage bzgl. der Restsharp - Anbindung an die REST - API von Shopware.

Das Abfragen von Artikelinformationen habe ich erfolgreich abgeschlossen jedoch hänge ich gerade bei den “PUT” versuchen.

Meine Funktion sieht wie folgt aus:

 

private void PutArticleStock(string URL)
    {
      var client = new RestClient(URL)
      {
        Authenticator = new DigestAuthenticator(user, pass)
      };
      Data d = new Data();           
      d.mainDetail = new MainDetail();      
      d.mainDetail.inStock = 55;     
      var request = new RestRequest("articles/{id}", Method.PUT);
      request.AddUrlSegment("id", 3.ToString(CultureInfo.InvariantCulture));     
      var adt = JsonConvert.SerializeObject(d).ToString(CultureInfo.InvariantCulture);
      request.AddParameter("application/json; charset=utf-8", adt, ParameterType.RequestBody);
      var iResponse = client.Execute(request);
    }




 public class DigestAuthenticator :
      IAuthenticator
    {
      private readonly string _user;
      private readonly string _pass;

      public DigestAuthenticator(string user, string pass)
      {
        _user = user;
        _pass = pass;
      }

      public void Authenticate(IRestClient client, IRestRequest request)
      {
        request.Credentials = new NetworkCredential(_user, _pass);
      }
    }

 

Wenn ich das Probramm jetzt laufen lasse erscheinen mir folgende Meldungen:

 

Das JSON das erzeugt wird sieht so aus:

 

{"id":0,"mainDetailId":0,"supplierId":0,"taxId":0,"priceGroupId":null,"filterGroupId":null,"configuratorSetId":null,"name":null,"description":null,"descriptionLong":null,"added":null,"active":false,"pseudoSales":0,"highlight":false,"keywords":null,"metaTitle":null,"changed":null,"priceGroupActive":false,"lastStock":false,"crossBundleLook":0,"notification":false,"template":null,"mode":0,"availableFrom":null,"availableTo":null,"mainDetail":{"id":0,"articleId":0,"unitId":0,"number":null,"supplierNumber":null,"kind":0,"additionalText":null,"active":false,"inStock":55,"stockMin":0,"weight":null,"width":null,"len":null,"height":null,"ean":null,"position":0,"minPurchase":0,"purchaseSteps":null,"maxPurchase":null,"purchaseUnit":null,"referenceUnit":null,"packUnit":null,"shippingFree":false,"releaseDate":null,"shippingTime":null,"prices":null,"attribute":null,"configuratorOptions":null},"tax":null,"propertyValues":null,"supplier":null,"propertyGroup":null,"customerGroups":null,"images":null,"configuratorSet":null,"links":null,"downloads":null,"categories":null,"similar":null,"related":null,"details":null,"seoCategories":null}

 

Ich weiß jetzt nicht ob es daran liegt aber ich putte mit request.AddJsonBody(order);

//liegt wahrscheinlich nicht daran, aber trotzdem mal als Hinweis vllt. ist es ja praktisch

@tny schrieb:

Ich weiß jetzt nicht ob es daran liegt aber ich putte mit request.AddJsonBody(order);

 

Hallo, danke für die Antwort aber wenn ich das mit "request.AddJsonBody(OBJEKT) ausführe kommt folgende Meldung

Er hat aber leider den Lagerbestand nicht korrigiert.

 

Hallo Ihr,

mit dem AddJsonBody kommt in der Variable iResponse folgedner Wert:

 

Es bloß auch keine Auswirkung:

Bei AddJsonBody brauchst du das JsonConvert nicht, also direkt AddJsonBody(d), aber wie gesagt, ich glaube es liegt an was anderem. Heute abend kann ich dir mehr dazu sagen, muss heute auch mit dem Artikel Endpunkt arbeiten :slight_smile:

1 „Gefällt mir“

@tny schrieb:

Bei AddJsonBody brauchst du das JsonConvert nicht, also direkt AddJsonBody(d), aber wie gesagt, ich glaube es liegt an was anderem. Heute abend kann ich dir mehr dazu sagen, muss heute auch mit dem Artikel Endpunkt arbeiten :)

 

Danke, dann warte ich noch: Bin schon leicht am verzweifeln :slight_smile:

Schon mal als kurze Rückmeldung:

ich werde über variants gehen (http://community.shopware.com/REST-API-Varianten-Endpunkt_detail_1694.html). Würde sich für dich ja vermutlich auch anbieten. 

So klappt es soweit bei mir (das eingefügte ist ungetestet, bei mir ist es weiter aufgeschachtelt und hab es hier zusammengefasst):

VariantsData variant = new VariantsData();
variant.id = 149;
variant.inStock = 10;

RestRequest request;
request = new RestRequest("variants/{id}", Method.PUT);
request.AddUrlSegment("id", variant.id.ToString(CultureInfo.InvariantCulture));
request.AddJsonBody(variant);
            
var updateArt = client.Execute(request);

 

Wie sieht denn deine Klasse VariantsData und die VariantsResponse aus?

Ist das ein Clon des JSON oder baust du dir da nur die Felder auf die du auch befüllen möchtest?

Aktuell so, ist aber noch automatisch konvertiert und nicht angepasst / kontrolliert:

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; }
    }

 

1 „Gefällt mir“

Und noch VariantsRespone:

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

 

Ich würde dich ja gerade gerne auf ein Bier einladen :slight_smile:

Es hat funktioniert mit den Lagerbestände.

VIELEN VIELEN VIELEN VIELEN Dank.

1 „Gefällt mir“

Hey tny oder alle anderen :slight_smile:

Die Aktualisierung der Lagerbestände funktioniert hervorragend.

ich habe mir jetzt noch einmal folgende Klassen angelegt. (Es geht um ein Preisupdate)

 in der VariantsData s.o. steht ja folgende zeile: (Bei mir umbenannt in VariantsPrice)

public List prices { 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 int basePrice { get; set; }
      public int percent { get; set; }
      public CustomerGroup customerGroup { get; set; }
    }
    public class CustomerGroup
    {
      public int id { get; set; }
      public string key { get; set; }
      public string name { get; set; }
      public bool tax { get; set; }
      public bool taxInput { get; set; }
      public bool mode { get; set; }
      public int discount { get; set; }
      public int minimumOrder { get; set; }
      public int minimumOrderSurcharge { get; set; }
    }

 

Der Auruf sieht dann erst einmal wie folgt aus:

        VariantsData variant = new VariantsData();
        variant.number = number;
        variant.inStock = stock;
        variant.active = 1;

        VariantsPrice articleprice = new VariantsPrice();
        articleprice.price = 12.55;
                
        variant.prices = new List();
        variant.prices.Add(articleprice);         

        RestRequest request = new RestRequest("variants/{id}?useNumberAsId=true", Method.PUT);
        request.AddUrlSegment("id", variant.number.ToString(CultureInfo.InvariantCulture));
        request.AddJsonBody(variant);
        var updateArt = client.Execute(request);

 

Jetzt kommt immer die Fehlermeldung:

 

“{“success”:false,“message”:”\\Shopware\\Models\\Article\\Price by id 0 not found"}"

Hat da jemand einen anderen Ansatz?

Viele Grüße