Hallo Gast

Call API from Python

  • 6 Reacties
  • 243 Gelezen
Call API from Python
« Gepost op: 08 november, 2020, 21:20:23 »
Ik wil de Acumulus API vanuit Python aanroepen maar krijg het door een gebrek aan ervaring en geschikte voorbeelden niet voor elkaar. Ik wil automatisch facturen naar Acumulus uploaden vanuit een SQL server database met alle factuur gegevens. Ik

Heeft iemand een werkend voorbeeld hoe ik de API kan aanroepen? 

Groet, Jan

p.s. Het zou handig zijn om voor de verschillende talen en methodes een code snippet te maken om snel van start te kunnen.

Re: Call API from Python
« Reactie #1 Gepost op: 09 november, 2020, 14:00:48 »
Dit is de code die niet werkt:

====

import urllib
import requests

url="https://api.sielsystems.nl/acumulus/stable/invoices/invoice_get_next_number.php"

xml="""<?xml version="1.0" encoding="UTF-8"?><myxml><contract><contractcode>####</contractcode>
       <username>######</username><password>#####</password><emailonerror>#####</emailonerror>
       <emailonwarning>######</emailonwarning></contract></myxml>"""
xml=urllib.parse.quote(xml)

headers = {'ContentType': 'application/x-www-form-urlencoded', 'ContentLength' : str(len(xml))}

r=requests.post(url, data=xml, headers=headers)

print (r.text)

====

En dit is de response:

<?xml version="1.0" encoding="UTF-8"?><response><errors><error><code>442</code><codetag>EXC-ZK03B</codetag><message>Error - Not Implemented - Please use the xmlstring or xmlfile approach or contact Acumulus Support.</message></error><count_errors>1</count_errors></errors><status>1</status></response>

*

Guido

  • 2145
    • Bekijk profiel
Re: Call API from Python
« Reactie #2 Gepost op: 09 november, 2020, 19:59:38 »
xml=urllib.parse.quote(xml)

Hiermee draai je de gehele inhoud van de xml variable door urllib.parse.quote. Daarmee encode je ook de xml control karacters. ( < , > , & , " en '  ) en genereer je invalid xml. vermoed ik ;)

Het is beter om elke variable apart te encoden.

c="12345"
c=urllib.parse.quote(c)
<contractcode>$c</contractcode>

- Guido

Re: Call API from Python
« Reactie #3 Gepost op: 09 november, 2020, 20:57:13 »
Bedankt Guido!

Ik ben weer wat verder gekomen. Het lukt me nu om een response te krijgen op endpoint  picklist_accounts.php maar zowel invoice_get_next_number.php als contacts_list.php geven foutmeldingen. Hieronder de code met de drie endpoints met twee uitgecommentarieerd. Dus exact dezelfde xmlstring gestuurd naar de drie endpoints geeft verschillende resultaten.  In de code-blokken eronder de response van de drie endpoints.

import requests

def fixed_xml_body_as_string():
    return """
    <?xml version='1.0' encoding='utf-8'?>
    <myxml>
        <contract>
            <contractcode>999999</contractcode>
            <username>API-99999</username>
            <password>9999999</password>
            <emailonerror>999999%40gmail.com</emailonerror>
            <emailonwarning>999999%40gmail.com</emailonwarning>
        </contract>
        <format>XML</format>
        <testmode>0</testmode>
        <lang>en</lang>
    </myxml>
    """

url="https://api.sielsystems.nl/acumulus/stable/picklists/picklist_accounts.php"
#url="https://api.sielsystems.nl/acumulus/stable/invoices/invoice_get_next_number.php"
#url="https://api.sielsystems.nl/acumulus/stable/contacts/contacts_list.php"

params = {'xmlstring' : fixed_xml_body_as_string()}

r = requests.post(url, params = params)

print (r.text)


picklist_accounts.php geeft volgende response zonder fouten

<?xml version="1.0" encoding="UTF-8"?>
<response><accounts><account><accountid>999999</accountid><accountnumber>99999999</accountnumber><accountdescription></accountdescription><accounttypeid>1</accounttypeid></account><account><accountid>175774</accountid><accountnumber>99999999</accountnumber><accountdescription>Deposito</accountdescription><accounttypeid>1</accounttypeid></account><account><accountid>175775</accountid><accountnumber>Zakelijke Credit Card</accountnumber><accountdescription></accountdescription><accounttypeid>1</accounttypeid></account><account><accountid>175772</accountid><accountnumber>Kas</accountnumber><accountdescription></accountdescription><accounttypeid>1</accounttypeid></account><account><accountid>175776</accountid><accountnumber>Ingenico</accountnumber><accountdescription></accountdescription><accounttypeid>1</accounttypeid></account><account><accountid>175778</accountid><accountnumber>Uitgekeerd dividend</accountnumber><accountdescription></accountdescription><accounttypeid>3</accounttypeid></account><account><accountid>175777</accountid><accountnumber>Rekening Courant - DGA</accountnumber><accountdescription>Josien Brandt</accountdescription><accounttypeid>1</accounttypeid></account><account><accountid>175779</accountid><accountnumber>Winstreserves vorig boekjaar</accountnumber><accountdescription></accountdescription><accounttypeid>4</accounttypeid></account><account><accountid>175780</accountid><accountnumber>VPB-afdrachten</accountnumber><accountdescription></accountdescription><accounttypeid>5</accounttypeid></account><account><accountid>175781</accountid><accountnumber>Borg Laan Copes 83 - Erven Ruys</accountnumber><accountdescription></accountdescription><accounttypeid>2</accounttypeid></account><account><accountid>175782</accountid><accountnumber>Vooruitbetaald</accountnumber><accountdescription></accountdescription><accounttypeid>2</accounttypeid></account><account><accountid>175783</accountid><accountnumber>Vooruitontvangen omzet</accountnumber><accountdescription></accountdescription><accounttypeid>4</accounttypeid></account><account><accountid>175784</accountid><accountnumber>Nog te betalen bedragen</accountnumber><accountdescription></accountdescription><accounttypeid>4</accounttypeid></account><account><accountid>177038</accountid><accountnumber>Memoriaal</accountnumber><accountdescription>geannuleerde cursussen etc</accountdescription><accounttypeid>2</accounttypeid></account><account><accountid>177041</accountid><accountnumber>Borg KG62 - Padox BV</accountnumber><accountdescription></accountdescription><accounttypeid>2</accounttypeid></account><account><accountid>189678</accountid><accountnumber>Bestedingsruimte Credit Card</accountnumber><accountdescription></accountdescription><accounttypeid>1</accounttypeid></account><account><accountid>189679</accountid><accountnumber>Rekening Courant - Nieuw Cruysenborch BV</accountnumber><accountdescription>Holding</accountdescription><accounttypeid>4</accounttypeid></account><account><accountid>194332</accountid><accountnumber>Borg KG62 - ontvangen</accountnumber><accountdescription>Taxateurs - Blitz</accountdescription><accounttypeid>4</accounttypeid></account><account><accountid>194852</accountid><accountnumber>Aandelenkapitaal</accountnumber><accountdescription></accountdescription><accounttypeid>3</accounttypeid></account><account><accountid>195097</accountid><accountnumber>Nog te ontvangen</accountnumber><accountdescription></accountdescription><accounttypeid>2</accounttypeid></account><account><accountid>195649</accountid><accountnumber>Deelbetaling debiteuren</accountnumber><accountdescription></accountdescription><accounttypeid>2</accounttypeid></account><account><accountid>-1</accountid><accountnumber>Account not part of Acumulus</accountnumber><accountdescription></accountdescription><accounttypeid></accounttypeid></account></accounts><errors><count_errors>0</count_errors></errors>
<warnings><count_warnings>0</count_warnings></warnings>
<status>0</status></response>


invoice_get_next_number.php  geeft volgende response

<?xml version="1.0" encoding="UTF-8"?><response><errors><error><code>442</code><codetag>EXC-ZK03B</codetag><message>Error - Not Implemented - Please use the xmlstring or xmlfile approach or contact Acumulus Support.</message></error><count_errors>1</count_errors></errors><status>1</status></response>


contacts_list.php  geeft volgende response

<?xml version="1.0" encoding="UTF-8"?>
<response><errors><error><code>403 Forbidden</code><codetag>KJ0B51AFP</codetag><message>No message available</message></error><count_errors>1</count_errors></errors>
<warnings><count_warnings>0</count_warnings></warnings>
<status>1</status></response>
« Laatst bewerkt op: 09 november, 2020, 20:59:06 door JanD »

*

Guido

  • 2145
    • Bekijk profiel
Re: Call API from Python
« Reactie #4 Gepost op: 09 november, 2020, 22:50:28 »
Hoi Jan,

invoice_get_next_number.php  geeft volgende response

<codetag>EXC-ZK03B</codetag><message>Error - Not Implemented - Please use the xmlstring or xmlfile approach or contact Acumulus Support.</message>

Ik zie in onze crashbucket dat er:

"xmlstring=%0A++++%3C%3Fxml+version%3D%271.0%27+encoding%3D%27utf-8%27%3F%3E%0A++++%3Cmyxml%3E%0A++++++++%3Ccontract%3E%0A++++++++++++%3Ccontractcode"
binnenkomt. Dat geeft de indruk dat je nog de gehele xml-brij encode, in plaats van de inhoud van de xml-nodes.

Citaat
contacts_list.php  geeft volgende response

<code>403 Forbidden</code><codetag>KJ0B51AFP</codetag><message>No message available</message>

De 403 kan meerdere oorzaken hebben. Het kan zijn dat hetzelfde probleem als bij invoice_get_next_number.php speelt met de encoding, maar het kan ook zijn dat je lege of verkeerde credentials opgeeft.

Gr,
Guido.

Re: Call API from Python
« Reactie #5 Gepost op: 10 november, 2020, 11:35:57 »
Hi Guido,

Bedankt voor de feedback. Om alle mogelijke encoding problemen uit te sluiten heb ik de clean xmlstring met alleen "@" in email adres  vervangen door "%40" in de chrome webbrowser en als volgt meegestuurd:

https://api.sielsystems.nl/acumulus/stable/picklists/picklist_accounts.php?xmlstring=<myxml><contract><contractcode>....

Net zoals in mijn python tests gaat het met bepaalde resources goed en geven de andere resources een foutmelding. De xmlstring die ik instuur is voor allemaal exact hetzelfde. Hieronder een overzicht de resultaten van een aantal resources:

picklist_accounts.php - werkt zoals verwacht

contact_get.php - werkt zoals verwacht als ik een correct contactid meegeef.

invoice_get_next_number.php  -   Error - 442 EXC-ZK03B Error - Not Implemented - Please use the xmlstring or xmlfile approach or contact Acumulus Support.

contacts_list.php - Error  - 403  KJ0B51AFP - No message available


Is er een verschil tussen de resources. Heeft het misschien te maken met de Connector informatie?  Die heb ik niet ingevuld omdat ik die niet gebruik. 


Waar kan ik een lijst vinden van de error codes en de codetags?


Met vriendelijke groeten, Jan

*

Guido

  • 2145
    • Bekijk profiel
Re: Call API from Python
« Reactie #6 Gepost op: 10 november, 2020, 11:58:36 »
De connector-informatie is niet verplicht, maar het kan helpen bij het oplossen van problemen. Ik heb recent op basis van de connector-informatie in onze crashbucket een gebruiker van de API kunnen informeren over een hele reeks verkeerde boekingen. Ook als je zelf versies van de software bijhoudt dan kun je soms terughalen waarom een bepaalde boeking is ingevoerd.

Een lijst met codes en codetags is er niet. Ik ben de API aan het refactoren en ben de codes aan het versimpelen. Dit is ook waarom je soms een iets andere response ziet van bepaalde calls. Technisch gezien is echter de verwerking van de xmlstring en xmlfile-opties gelijk.

Voor wat betreft de foutmelding bij invoice_get_next_number,.. ik zag nog steeds een volledig ge-encode string voorbij komen zoals hieronder:

https://api.sielsystems.nl//acumulus/stable/invoices/invoice_get_next_number.php?xmlstring=%3Cmyxml%3E%3Ccontract%3E%3Ccontractcode%3 ...
Kan het zijn dat je toch ergens verschillend aanroept?

Als je de beschikking hebt over een eigen webserver waarop je een test-xml kunt hosten dan kun je wellicht problemen met de aanroep uitsluiten, of bevestigen door de API te bevragen met:

https://api.sielsystems.nl//acumulus/stable/invoices/invoice_get_next_number.php?xmlfile=https://www.example.com/test.xml
Gr,
Guido