Beantwortet

AuftragCreate über REST API liefert invalid key


Wir möchten über der API von unserer Versandsoftware bei Warenausgang die Lagerzahlen reduzieren.
Dazu möchte ich über die REST API einen abgeschlossenen Auftrag anlegen und hoffe, dass sich darüber die Lagerzahlen entsprechend updaten.

Digest Auth funktioniert. Leider bekomme ich aber zurück:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<status>
<action>AuftragCreate</action>
<message>Invalid key (id)</message>
<messageCode>5</messageCode>
</status>
<xml>address not found</xml>
</response>

 Diese beiden Themen hatten das gleiche Problem, haben mir aber nicht bei der Problemlösung geholfen:

 

Mein Request-Body:

<?xml version="1.0" encoding="UTF-8"?>
<request>
<status>
<function>AuftragCreate</function>
</status>
<xml>
<kundennummer>10008</kundennummer>
<artikelliste>
<position>
<nummer>1</nummer>
<preis>9.99</preis>
<menge>2</menge>
<waehrung>EUR</waehrung>
</position>
</artikelliste>
</xml>
</request>

Die Kundennummer ist definitiv im System

Hier der gesamte Node.js Code

import convert from "xml-js"
import {request} from "urllib";

const auftrag = {
"kundennummer": 10008,
"artikelliste": {
"position": [
{
"nummer": 1,
"preis": 9.99,
"menge": 2,
"waehrung": "EUR"
},
]
}
}

const req = {
request: {
status: {
function: "AuftragCreate"
},
xml: auftrag,
}
}

const requestXMLString = '<?xml version="1.0" encoding="UTF-8"?>\n' + convert.json2xml(JSON.stringify(req), {compact: true, spaces: 4});

console.log(requestXMLString)

const url = 'https://*********.xentral.biz/api/AuftragCreate';
const options = {
content: requestXMLString,
method: 'POST',
streaming: true,
digestAuth: "************:**********",
};

console.log(requestXMLString)
const response = await request(url, options);
const responseText = await response.res.text();
console.log(responseText)

 

Hat hier jemand eine Idee woran es liegen könnte?

Xentral-Version: 23.0.8

 

Ich bin schon einigermaßen frustriert, da ich schon diese Schritte hinter mir habe:

  1. die neue Xentral API implementiert → Benötigte Endpunkte nicht vorhanden
  2. Die REST API Digest Auth implementiert habe → Benötigte Endpunkte nicht vorhanden
  3. Standard API Zugriff über REST API Digest gebaut habe → keine JSON Unterstützung → XML Konvertierung

 

Gruß

Niklas

icon

Beste Antwort von chuck_aguilar 10 February 2023, 16:47

Original anzeigen

5 Antworten

Benutzerebene 3
Abzeichen

Hi @niklasdahlheimer ,

 

Danke für deine Frage. 

 

Das hier funktioniert für mich: 

 

var request = require("request");
var options = {
method: "POST",
url: "https://xxxxxxx.xentral.biz/api/AuftragCreate",
headers: {
"Content-Type": "application/xml"
},
body: `
<xml>
<kundennummer>10004</kundennummer>
<projekt>2</projekt>
<artikelliste>
<position>
<nummer>1000231</nummer>
<!--<preis>19.95</preis>-->
<menge>2</menge>
<!--waehrung>EUR</waehrung-->
</position>
</artikelliste>
<versandart>keinversand</versandart>
</xml>
`
};

request(options, function(error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
<?xml version="1.0" encoding="UTF-8"?>
<response>
<status>
<action>AuftragCreate</action>
<message>OK</message>
<messageCode>1</messageCode>
</status>
<xml>
<id>439</id>
<belegnr>200281</belegnr>
</xml>
</response>

 

Hilft es dir? 


Wegen `JSON`, wir sind dabei unsere API zu verbessern. Dafür gibt’s eine neue API, und ein Roadmap. “Auftrag Create” (Create Sales Order) ist noch nicht fertig, aber du kannst es hier https://developer.xentral.com/page/roadmap verfolgen. 

Viele Grüße, 
Chuck. 

 

Hallo Chuck,

danke für die Rückmeldung. Hilft leider nicht, ich kriege weiterhin Code 5 (“Invalid key (id)”) zurück. Ich habe es mit/ohne Projektnummer, mit/ohne Projektbezeichnung, etc. versucht...

Muss der API Account noch irgendwie dem Projekt zugewiesen werden?
Gibt es auf Xentral-Seite Logging in dem man ggf. nachschauen kann was nicht funktioniert?

Benutzerebene 5
Abzeichen +2

Hallo @niklasdahlheimer 

nach Deinem Requestbody ganz oben schließe ich, dass Du evtl. den Aufruf falsch schickst. So wie es aussieht, verwendest Du noch eine ältere Dokumentation und evtl. die Hash-Authentifizierung?

Verwende für die Calls der Standard-API nicht mehr die Authentifizierung per Hash, sondern per Digest und geh über die REST-API. Details findest Du in der Dokumentation der REST-API: https://update.xentral.biz/apidoc/docs224.html#standard_api_aufrufe

Dort sind die Standard-API-Calls direkt erreichbar

/api/AuftragCreate

Dazu kommt dann folgende XML-Payload:

<xml>
<kundennummer>10008</kundennummer>
<artikelliste>
<position>
<nummer>1</nummer>
<preis>9.99</preis>
<menge>2</menge>
<waehrung>EUR</waehrung>
</position>
</artikelliste>
</xml>

Grüße aus Augsburg
Jörn

Hallo Jörn,

Ich verwende die Digest Authentifizierung mit Hilfe einer Request-Library (https://www.npmjs.com/package/urllib). Die Authentifizierung funktioniert, da ich keinen 401 zurück bekomme und Anfragen ohne Body, z.B. “AuftragGet”, funktionieren.

Nachdem ich nun

  1. den umschließenden <request> inkl. <status> etc. entfernt habe und
  2. als Header 
"Content-type": "application/xml"

hinzugefügt habe,

funktioniert es. Leider ist die Dokumentation dazu eher lückenhaft. Die Info bzgl. des Headers konnte ich zum Beispiel nirgendwo finden.

Benutzerebene 5
Abzeichen +2

Hallo @niklasdahlheimer 

dann bist Du aber durch. Dann war es schlicht eine falsche Payload.

Wir haben für unsere Kunden eine Postman-Collection in der viele Beispielcodes der beiden bisherigen APIs enthalten sind. Die haben wir in mühevoller Kleinarbeit erstellt - da steckt tatsächlich viel Try & Error drinnen :-)

Meld Dich, wenn Du Fragen hast.

Viele Grüße
Jörn

Antworten