API Validation Error

Hallo zusammen,

 

beim Anlegen eines Artikels über die API kommt folgende Fehlermeldung:

{
	"success": false,
	"message": "Validation error",
	"errors": [
		"tax: This value should not be blank.",
		"mainDetail.number: This value should not be blank.",
		"name: This value should not be blank."
	]
}

 

Der gesendete Testartikel lautet:

{
	"data": {
		"name": "nicotest",
		"id": 0,
		"description": null,
		"links": null,
		"active": true,
		"mainDetailId": 0,
		"supplierId": 0,
		"taxId": 0,
		"priceGroupId": null,
		"filterGroupId": null,
		"configuratorSetId": null,
		"descriptionLong": null,
		"added": null,
		"pseudoSales": 0,
		"highlight": null,
		"keywords": null,
		"priceGroupActive": null,
		"lastStock": null,
		"crossBundleLook": 0,
		"notification": null,
		"template": null,
		"availableFrom": null,
		"availableTo": null,
		"mainDetail": {
			"id": 0,
			"number": "SKU101001",
			"position": 0,
			"attribute": null,
			"unitId": null,
			"supplierNumber": null,
			"kind": 0,
			"additionalText": null,
			"active": null,
			"inStock": 0,
			"stockMin": 0,
			"weight": null,
			"width": null,
			"len": null,
			"height": null,
			"ean": null,
			"purchasePrice": null,
			"minPurchase": 0,
			"purchaseSteps": null,
			"maxPurchase": null,
			"purchaseUnit": null,
			"referenceUnit": null,
			"packUnit": null,
			"shippingFree": null,
			"releaseDate": null,
			"shippingTime": null,
			"prices": [
				{
					"id": 0,
					"from": 0,
					"articleId": 0,
					"articleDetailsId": 0,
					"customerGroupKey": "EK",
					"to": null,
					"price": 22.9,
					"pseudoPrice": 0,
					"customerGroup": null,
					"percent": 0
				}
			],
			"configuratorOptions": null,
			"articleId": 0
		},
		"propertyValues": null,
		"supplier": {
			"name": "Nico Hersteller",
			"id": null,
			"description": null,
			"link": null,
			"metaDescription": null,
			"image": null,
			"metaTitle": null,
			"metaKeywords": null,
			"changed": null
		},
		"propertyGroup": null,
		"customerGroups": null,
		"images": null,
		"configuratorSet": null,
		"downloads": null,
		"categories": [
			"NicoKategorie"
		],
		"similar": null,
		"related": null,
		"details": null,
		"seoCategories": null,
		"tax": {
			"name": "19",
			"id": 0,
			"tax": "19"
		},
		"metaTitle": null,
		"changed": null,
		"mode": 0
	}
}

 

Hat jemand selbiges schon mal gehabt? Was kann da das Problem sein? 

Ich glaube deine Array-Syntax ist falsch. MainDetail und Tax sind auf jeden Fall arrays.

Siehe: REST API - Examples using the article resource

Müsste dann ggf. so aussehen wir bei prices.

Bin selbst aber auch kein API-Spezialist :slight_smile:

Sieht so aus wie gar nichts akzeptiert wird von deinen Daten (zB. ‘name’ value should not be blank, und du hast deutlich ‘name’ angegeben).

Wie sendest du eigentlich die Daten? Weil du hast da alles in “data” { … } eingekapselt.

Daten gehören im Body vom Request, ArtikelObject als serialized JSON string.

Beispeil in C#:

string jsonArtikel = JsonConvert.SerializeObject(myTestArtikel, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

request.AddParameter("application/json; charset=utf-8", jsonArtikel, ParameterType.RequestBody);

response = client.Execute(request);

Versuche also erst einfach ein Artikel zu senden mit nur ‘name’, ‘active’ und ‘taxId’. Wenn kein ValidationError von der ‘name’ kommt, sind die Daten schon mal richtig formattiert, und kannst du rest der Daten hinzufügen.

Hi Danke für eure Antworten. Hab das so aufgebaut wie mir der Artikel ausgegeben wird, daher alles in Data.

hat jemand ein json wie es aussehen muss?

Hab nochmalmal geschaut, ich bekomme Maindetail aber auch nicht als Array vom Shop siehe hier, eine response von einem existierenden Artikel

 

{
	"data": {
		"id": 167,
		"mainDetailId": 741,
		"supplierId": 12,
		"taxId": 1,
		"priceGroupId": null,
		"filterGroupId": null,
		"configuratorSetId": null,
		"name": "Testartikelbezeichnung",
		"description": "",
		"descriptionLong": "beschreibuuuuuuuuuuuuuuuuuuung",
		"added": "2016-03-19T00:00:00+0100",
		"active": true,
		"pseudoSales": 0,
		"highlight": false,
		"keywords": "",
		"metaTitle": "",
		"changed": "2017-09-30T10:12:00+0200",
		"priceGroupActive": false,
		"lastStock": false,
		"crossBundleLook": 0,
		"notification": false,
		"template": "",
		"mode": 0,
		"availableFrom": null,
		"availableTo": null,
		"mainDetail": {
			"id": 741,
			"articleId": 167,
			"unitId": null,
			"number": "SW10001",
			"supplierNumber": "",
			"kind": 1,
			"additionalText": "",
			"active": true,
			"inStock": 0,
			"stockMin": 0,
			"weight": null,
			"width": null,
			"len": null,
			"height": null,
			"ean": "",
			"purchasePrice": "0",
			"position": 0,
			"minPurchase": 1,
			"purchaseSteps": null,
			"maxPurchase": null,
			"purchaseUnit": null,
			"referenceUnit": null,
			"packUnit": "",
			"shippingFree": false,
			"releaseDate": null,
			"shippingTime": "",
			"prices": [
				{
					"id": 874,
					"articleId": 167,
					"articleDetailsId": 741,
					"customerGroupKey": "EK",
					"from": 1,
					"to": "1",
					"price": 84.033613445378,
					"pseudoPrice": 0,
					"percent": 0,
					"customerGroup": {
						"id": 1,
						"key": "EK",
						"name": "Shopkunden",
						"tax": true,
						"taxInput": true,
						"mode": false,
						"discount": 0,
						"minimumOrder": 10,
						"minimumOrderSurcharge": 5
					}
				},
				{
					"id": 875,
					"articleId": 167,
					"articleDetailsId": 741,
					"customerGroupKey": "EK",
					"from": 2,
					"to": "beliebig",
					"price": 0,
					"pseudoPrice": 0,
					"percent": 0,
					"customerGroup": {
						"id": 1,
						"key": "EK",
						"name": "Shopkunden",
						"tax": true,
						"taxInput": true,
						"mode": false,
						"discount": 0,
						"minimumOrder": 10,
						"minimumOrderSurcharge": 5
					}
				}
			],
			"attribute": {
				"id": 753,
				"articleId": 167,
				"articleDetailId": 741,
				"attr1": "",
				"attr2": "",
				"attr3": "",
				"attr4": "",
				"attr5": "",
				"attr6": "",
				"attr7": "",
				"attr8": "",
				"attr9": "",
				"attr10": "",
				"attr11": "",
				"attr12": "",
				"attr13": "",
				"attr14": "",
				"attr15": "",
				"attr16": "",
				"attr17": null,
				"attr18": "",
				"attr19": "",
				"attr20": ""
			},
			"configuratorOptions": []
		},
		"tax": {
			"id": 1,
			"tax": "19.00",
			"name": "19%"
		},
		"propertyValues": [],
		"supplier": {
			"metaTitle": null,
			"metaDescription": null,
			"metaKeywords": null,
			"id": 12,
			"name": "Testhersteller",
			"image": "",
			"link": "",
			"description": null,
			"changed": "2016-03-19T10:33:54+0100"
		},
		"propertyGroup": null,
		"customerGroups": [],
		"images": [],
		"configuratorSet": null,
		"links": [],
		"downloads": [],
		"categories": [
			{
				"id": 1342,
				"name": "Collier"
			}
		],
		"similar": null,
		"related": null,
		"details": [],
		"seoCategories": []
	},
	"success": true
}

 

 

Habe auch MainDetail mal als Array gesendet, geht auch nicht, kommt die selbe fehlermeldung

{
	"data": {
		"name": "nicotest",
		"id": 0,
		"tax": {
			"name": "19",
			"id": 0,
			"tax": "19"
		},
		"metaTitle": null,
		"changed": null,
		"active": true,
		"mainDetailId": 0,
		"supplierId": 0,
		"taxId": 0,
		"priceGroupId": null,
		"filterGroupId": null,
		"configuratorSetId": null,
		"descriptionLong": null,
		"added": null,
		"pseudoSales": 0,
		"highlight": null,
		"keywords": null,
		"priceGroupActive": null,
		"lastStock": null,
		"crossBundleLook": 0,
		"notification": null,
		"template": null,
		"availableFrom": null,
		"availableTo": null,
		"mainDetail": [
			{
				"id": 0,
				"number": "SKU101001",
				"articleId": 0,
				"unitId": null,
				"supplierNumber": null,
				"kind": 0,
				"additionalText": null,
				"active": null,
				"inStock": 0,
				"stockMin": 0,
				"weight": null,
				"width": null,
				"len": null,
				"height": null,
				"ean": null,
				"purchasePrice": null,
				"minPurchase": 0,
				"purchaseSteps": null,
				"maxPurchase": null,
				"purchaseUnit": null,
				"referenceUnit": null,
				"packUnit": null,
				"shippingFree": null,
				"releaseDate": null,
				"shippingTime": null,
				"prices": [
					{
						"id": 0,
						"from": 0,
						"articleId": 0,
						"articleDetailsId": 0,
						"customerGroupKey": "EK",
						"to": null,
						"price": 22.9,
						"pseudoPrice": 0,
						"customerGroup": null,
						"percent": 0
					}
				],
				"configuratorOptions": null,
				"position": 0,
				"attribute": null
			}
		],
		"propertyValues": null,
		"supplier": {
			"name": "Nico Hersteller",
			"id": null,
			"metaTitle": null,
			"image": null,
			"metaDescription": null,
			"metaKeywords": null,
			"changed": null,
			"description": null,
			"link": null
		},
		"propertyGroup": null,
		"customerGroups": null,
		"images": null,
		"configuratorSet": null,
		"downloads": null,
		"categories": [
			"NicoKategorie"
		],
		"similar": null,
		"related": null,
		"details": null,
		"seoCategories": null,
		"description": null,
		"links": null,
		"mode": 0
	}
}

 

Entfernen Sie bitte die außere „data“: und die { } die dazu gehören.

Bei mir sieht ein POST Request so aus:

POST https://shop.blabla.com/api/articles HTTP/1.1
Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
User-Agent: RestSharp/105.2.3.0
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip, deflate
Authorization: Digest username="blabla",realm="Shopware REST-API", nonce="blabla",uri="/api/articles",algorithm="MD5",cnonce="blabla", und noch mehr Daten hier
Host: shop.blabla.com
Content-Length: 857
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

{
  "supplierId": 33,
  "taxId": 5,
  "name": "BT30 - B16",
  "description": "BT30 - B16",
  "active": true,
  "mainDetail": {
    "number": "AHOUBT3DRIB16",
    "supplierNumber": "305.14.16",
    "active": true,
    "inStock": 0,
    "stockMin": 0,
    "weight": "0,000",
    "minPurchase": 0,
    "prices": [
      {
        "customerGroupKey": "EK",
        "from": 1.0,
        "to": "-",
        "price": 35.0,
        "pseudoPrice": 0.0,
        "basePrice": 0.0,
        "percent": 0.0
      },
      {
        "customerGroupKey": "H",
        "from": 1.0,
        "to": "-",
        "price": 35.0,
        "pseudoPrice": 0.0,
        "basePrice": 0.0,
        "percent": 0.0
      }
    ]
  },
  "categories": [
    {
      "id": 164
    },
    {
      "id": 324
    },
    {
      "id": 482
    }
  ]
}

 

Hy,

seid dem letzten Update auf 5.3. haben wir auch vermerkt diese Fehlermeldung bei der API.
Dies trifft eigentlich immer neue Artikel die damit angelegt werden sollen. (POST)
 

taxId als auch tax ist gesetzt, Ein name auch und eine Artikelnummer unter mainDetail -> number ebenfalls.
Zu beobachten ist dabei, wenn kurz vorher ein Artikel geupdatet wurde, kommt der Fehler nicht.

 

Beste Grüße

 

Array
(
    [KaDIS-Artikelsteuerung] => aktiv
    [Verkaufsplattform] => SHOP
    [supplier_name] => feinSTOFF
    [active] => 1
    [tax] => 7
    [propertyGroup] => Array
        (
            [id] => 1
            [name] => SHOP
            [position] => 0
            [comparable] => 0
            [sortmode] => 0
        )

    [mainDetail] => Array
        (
            [number] => 101696
            [prices] => Array
                (
                    [0] => Array
                        (
                            [customerGroupKey] => EK
                            [price] => 9.99
                            [pseudoPrice] => 0
                            [basePrice] => 0
                            [from] => 1
                            [to] => beliebig
                        )

                )

            [supplierNumber] => 7000005
            [kind] => 1
            [active] => 1
            [inStock] => 0
            [stockMin] => 1
            [weight] => 0.000
            [width] => 0.000
            [len] => 0.000
            [height] => 0.000
            [position] => 0
            [purchaseUnit] => 30.0000
            [referenceUnit] => 100.000
            [unit] => Array
                (
                    [unit] => g
                    [name] => Gramm
                )

            [packUnit] => Stück
            [shippingFree] => 0
            [shippingTime] => 5
            [attribute] => Array
                (
                    [attr11] => #973d40
                    [attr1] =>
                    [attr2] =>
                    [attr3] =>
                    [attr4] =>
                    [attr5] =>
                    [attr6] =>
                    [attr7] =>
                    [attr8] =>
                    [attr9] =>
                    [attr10] =>
                    [attr12] =>
                    [attr13] =>
                    [attr14] =>
                    [attr15] =>
                    [attr16] =>
                    [attr17] => 0
                    [attr18] =>
                    [attr19] =>
                    [attr20] =>
                )

            [additionaltext] =>
        )

    [name] => *SP* Feinstoff BIO Acai Berry Bowl
    [metaTitle] => Feinstoff BIO Protein Bowl - jetzt online kaufen!
    [keywords] => vegan, Frühstück, Bowl, Breakie, Breakfast, glutenfrei, Frühstück, Feinstoff, bio, Breakiebowl
    [similar] => Array
        (
            [0] => Array
                (
                    [id] => 637
                    [name] => Roobar BIO Rohkost-Riegel Chia & Kokosnuss
                )

            [1] => Array
                (
                    [id] => 1368
                    [name] => Rosengarten BIO Vegan Plus Frühstücksbrei mit Chia
                )

            [2] => Array
                (
                    [id] => 2080
                    [name] => Feinstoff BIO Protein Bowl
                )

        )

    [lastStock] => 1
    [notification] => 0
    [translations] => Array
        (
        )

    [supplierId] => 263
    [taxId] => 4
    [descriptionLong] => 
    [related] =>
    [filterGroupId] => 1
    [propertyValues] => Array
        (
            [0] => Array
                (
                    [id] => 11
                    [optionID] => 2
                    [value] => vegan
                    [position] => 6
                    [media_id] =>
                )

            [1] => Array
                (
                    [id] => 5
                    [optionID] => 2
                    [value] => glutenfrei
                    [position] => 0
                    [media_id] =>
                )

            [2] => Array
                (
                    [id] => 7
                    [optionID] => 2
                    [value] => bio
                    [position] => 2
                    [media_id] =>
                )

            [3] => Array
                (
                    [id] => 6
                    [optionID] => 2
                    [value] => sojafrei
                    [position] => 1
                    [media_id] =>
                )

        )

)

API: No Success for Article 101696: Validation error 
Fehler [0] -> tax: This value should not be blank.
Fehler [1] -> mainDetail.number: This value should not be blank.
Fehler [2] -> name: This value should not be blank.

 

@import2shop schrieb:

 

Habe auch MainDetail mal als Array gesendet, geht auch nicht, kommt die selbe fehlermeldung

{
„data“: {
„name“: „nicotest“,
„id“: 0,
„tax“: {
„name“: „19“,
„id“: 0,
„tax“: „19“
},
„metaTitle“: null,
„changed“: null,
„active“: true,
„mainDetailId“: 0,
„supplierId“: 0,
„taxId“: 0,
„priceGroupId“: null,
„filterGroupId“: null,
„configuratorSetId“: null,
„descriptionLong“: null,
„added“: null,
„pseudoSales“: 0,
„highlight“: null,
„keywords“: null,
„priceGroupActive“: null,
„lastStock“: null,
„crossBundleLook“: 0,
„notification“: null,
„template“: null,
„availableFrom“: null,
„availableTo“: null,
„mainDetail“: [
{
„id“: 0,
„number“: „SKU101001“,
„articleId“: 0,
„unitId“: null,
„supplierNumber“: null,
„kind“: 0,
„additionalText“: null,
„active“: null,
„inStock“: 0,
„stockMin“: 0,
„weight“: null,
„width“: null,
„len“: null,
„height“: null,
„ean“: null,
„purchasePrice“: null,
„minPurchase“: 0,
„purchaseSteps“: null,
„maxPurchase“: null,
„purchaseUnit“: null,
„referenceUnit“: null,
„packUnit“: null,
„shippingFree“: null,
„releaseDate“: null,
„shippingTime“: null,
„prices“: [
{
„id“: 0,
„from“: 0,
„articleId“: 0,
„articleDetailsId“: 0,
„customerGroupKey“: „EK“,
„to“: null,
„price“: 22.9,
„pseudoPrice“: 0,
„customerGroup“: null,
„percent“: 0
}
],
„configuratorOptions“: null,
„position“: 0,
„attribute“: null
}
],
„propertyValues“: null,
„supplier“: {
„name“: „Nico Hersteller“,
„id“: null,
„metaTitle“: null,
„image“: null,
„metaDescription“: null,
„metaKeywords“: null,
„changed“: null,
„description“: null,
„link“: null
},
„propertyGroup“: null,
„customerGroups“: null,
„images“: null,
„configuratorSet“: null,
„downloads“: null,
„categories“: [
„NicoKategorie“
],
„similar“: null,
„related“: null,
„details“: null,
„seoCategories“: null,
„description“: null,
„links“: null,
„mode“: 0
}
}

Okay, generell hast du schon mal viele Felder dabei, die du gar nicht brauchst beim Anlegen eines Artikels - darunter z.B. mainDetailid und Co. Da der Artikel noch nicht existiert kann es die auch noch nicht geben. Ich habe mal unten ein Gerüst eingefügt, wie unsere Artikel (bisher ohne größere Probleme) angelegt werden. Einige Bereiche (z.B. prices) habe ich einfach mal als Array stehen gelassen, den Aufbau kannst du dir im Detail ja über die Beschreibung anschauen.

$article= array(
	   	'supplierId' => $supplierID, 
	   	'taxId' => 1,             		
	   	'name' => $articleName,
		'description' => $articleDescription,	  
		'descriptionLong' => $articleDescriptionLong,
		'added' => date("Y-m-d")."T".date("H:i:s")."+0200",
		'active' => true,
		'template' => $templates_arr["value"],
    		'changed' => date("Y-m-d")."T".date("H:i:s")."+0200",
    		'keywords' => "",
		'metaTitle' => "",
    		'mainDetail' => array(
	     		'number' => $tmp_artikel_number,
	     	  	'inStock' => $anz_items["Menge"],
	     	 	'ean' => $anz_items["EAN"], 		    	
			'active' => 1,
	    		'minPurchase' => 1,
	    		'purchaseUnit' => $cleanValueContains,
	    		'referenceUnit' => $cleanValueContainsBase,
	    		'packUnit' => $unit,
   		    	'weight' => round((float)str_replace(",",".",$weight),3),
	    		'prices' => $pricegroup_arr
	    	),
	    	'categories' => $kategorie_arr,
	        'images' => array($images_arr),
	);

Sieht dann in etwa so aus, halt recht schlicht gehalten… Sofern der Supplier in Shopware schon existiert würde ich den vielleicht vorher versuchen auszulesen und nur noch die ID mitzugeben - ansonsten riskierst du den doppelt anzulegen bei Schreibfehlern

Hallo,

ich habe ein ähnliches Problem, beim Anlegen eines Artikels komme ich nicht an der Tax vorbei. Je nachdem was ich schicke, bekomme ich entweder “tax: This value should not be blank”, oder “Expected value of type “Shopware\Models\Tax\Tax” for association field “Shopware\Models\Article\Article#tax”, got “array” instead”.

Ich schicke folgendes für “…not be blank”

 

{
        "MainDetail": {
            "Id": 0,
            "Number": "sku-123-test-api",
            "Kind": 0,
            "Active": true,
            "InStock": 0,
            "StockMin": 0,
            "ShippingFree": false,
            "Prices": [
                {
                    "Id": 0,
                    "CustomerGroupKey": "EK",
                    "Price": 123.45,
                    "PseudoPrice": 0,
                    "BasePrice": 0,
                    "Percent": 0
                }
            ]
        },
        "Categories": [
            {
                "Id": 6
            }
        ],
        "Id": 0,
        "MainDetailId": 0,
        "SupplierId": 1,
        "TaxId": 1,
        "ConfiguratorSetId": 0,
        "Name": "Test via API",
        "Added": "0001-01-01T00:00:00",
        "Active": true,
        "PseudoSales": 0,
        "Highlight": false,
        "PriceGroupActive": false,
        "LastStock": false,
        "CrossBundleLook": false,
        "Notification": false,
        "Mode": 0
    }

 

und folgendes für “…array instead” (TaxId: 0 oder TaxId 1 oder gar kein TaxId-Property ist wurscht)

{
        "MainDetail": {
            "Id": 0,
            "Number": "sku-123-test-api",
            "Kind": 0,
            "Active": true,
            "InStock": 0,
            "StockMin": 0,
            "ShippingFree": false,
            "Prices": [
                {
                    "Id": 0,
                    "CustomerGroupKey": "EK",
                    "Price": 123.45,
                    "PseudoPrice": 0,
                    "BasePrice": 0,
                    "Percent": 0
                }
            ]
        },
        "Tax": {
            "Id": 1,
            "Tax": "19.00",
            "Name": "19%"
        },
        "Categories": [
            {
                "Id": 6
            }
        ],
        "Id": 0,
        "MainDetailId": 0,
        "SupplierId": 1,
        "TaxId": 0,
        "ConfiguratorSetId": 0,
        "Name": "Test via API",
        "Added": "0001-01-01T00:00:00",
        "Active": true,
        "PseudoSales": 0,
        "Highlight": false,
        "PriceGroupActive": false,
        "LastStock": false,
        "CrossBundleLook": false,
        "Notification": false,
        "Mode": 0
    }

Ich erzeuge den Article in C#

var article = new Article
            {
                Name = "Test via API",
                Active = true,
                TaxId = TaxObject.Default.Id,
                //Tax = TaxObject.Default,
                SupplierId = Supplier.Default.Id,
                Categories = new List
                {
                    new CategoryIdItem{Id = 6} // "root/sub1/sub2
                },

                MainDetail = new ArticleDetail
                {
                    Number = "sku-123-test-api",
                    Active = true,
                    Prices = new List
                    {
                        new PriceObject
                        {
                            Price = 123.45,
                            CustomerGroupKey = "EK"
                        }
                    }
                }
            };

Wenn ich mich an das Beispiel aus der SW-Doku halte (“Tax”:1 bzw. “Tax”:19) , bekomme ich “Cannot create metadata for non-objects. Got: integer”

Kann mir jemad sagen, wo der Fehler liegt?

/Edit: Ich nutze Shopware 5.3.7

Okay, beide Beispiele oben funktionieren im Prinzip schon. SW (oder PHP) ist bei Json aber wohl etwas empfindlich/intolerant und kommt mit UpperCamelCase-Propertynamen nicht sonderlich gut zurecht, sondern benötigt zwingnd lowerCamelCase.

Im Falle von C# bedeutet das, den ContractResolver auf CamelCasePropertyNamesContractResolver zu setzen:

var jsonFormatter = new JsonMediaTypeFormatter
{
    SerializerSettings = new JsonSerializerSettings
    {
        NullValueHandling = NullValueHandling.Ignore,
        DefaultValueHandling = DefaultValueHandling.Ignore,
        
        // Note: format in lowerCamelCase:
        ContractResolver = new CamelCasePropertyNamesContractResolver() 
    }
};

var response = await _httpClient.PostAsync(resource, item, jsonFormatter)
                                .ConfigureAwait(continueOnCapturedContext: false);