Τι είναι το Web Service ή διαδικτυακή υπηρεσία;
Μια διαδικτυακή υπηρεσία είναι:- μια υπηρεσία που προσφέρεται από μια ηλεκτρονική συσκευή σε μια άλλη ηλεκτρονική συσκευή, που επικοινωνούν μεταξύ τους μέσω του Διαδικτύου
- ή ένας διακομιστής που λειτουργεί σε μια συσκευή υπολογιστή και ακούει αιτήματα σε μια συγκεκριμένη θύρα μέσω δικτύου
Η πρώτη έκδοση που υποστηρίζει Web Service & Rest API είναι η 2.9.1.10
https://mysoftwarehouse.gr/topver/2.9/2.9.1/2.9.1.10/
Installation
- Στον ήδη υπάρχον φάκελο εγκατάσταση του Topvalue, αντιγράφουμε το TopValueSrv.exe όπου το έχουν κατεβάσει από τον παραπάνω σύνδεσμο.
- Ανοίγουμε ένα Command Prompt Line (cmd) με δικαιώματα διαχειριστή και πηγαίνουμε στον φάκελο εγκατάστασης του Topvalue.
- Δημιουργούμε ένα αρχείο service.ini Η σύνταξη του είναι όπως αναγράφεται και στην ενότητα Εισαγωγή Παραμέτρων στο Login
Παράδειγμα:[APPLICATION] C=test1 U=supervisor apiUser=kostas apiPass=@apo@123 ApiRoot=root ApiPort=190 log=2
log parameter can be=
- 0 no log,
- 1 log url string,
- 2 log also in body
Τα αρχεία καταγραφής (log) είναι ανά ημέρα, στον φάκελο LOG μέσα στον φάκελο εγκατάσταση του Topvalue.
****Στο prm αρχείο να προτιμάται ο sql χρήστης και password. Σε περίπτωση Windows authentication, θα πρέπει ο χρήστης των Windows που τρέχει το Service, να έχει δικαιώματα πρόσβασης στον Sql Server. - Εκτελούμε την εντολή TopValueSrv.exe /install
- Ξεκινάμε το service.Έχουμε 2 επιλογές
- Τρέχουμε την συντόμευση TopValueSrv
- Ανοίγουμε τα services των Windows, βρίσκουμε από την λίστα το My Software House TopValue Service και κάνουμε Start.
Οποιοδήποτε σφάλμα προκύψει, καταγράφεται στο TopValue.log
Επικύρωση
Η επικύρωση των στοιχείων πρόσβασης γίνεται ως εξής:
- Basic (Περίπτωση που κάνουμε request από Postman)
username= ApiUsername eg kostas
password= ApiPassWord + #SerialNumber eg @apo@123#301-00999 - Base64 (Περίπτωση που κάνουμε request μέσα από script) eg a29zdGFzOkBhcG9AMTIzIzMwMS0wMDk5OQ== (Σχετικό παράδειγμα μπορείτε να βρείτε στην ενότητα Script Examples)
REST API Endpoint
return
{"App":"TopValue", "SN":"301-00187"}
body
{
"bo": "TCustomerbo",
"Keyvalues": [
1960027845
],
"// or fromKey": "integer",
"count": "integer optional default 50"
}
return:if result is many Array of Object(row) or Object(row) if one{
"ID": 1960027845,
"RowType": 1,
"Code": "json2",
"Account_Type": 200,
"Name": "json επωνυμία",
"Profession": "a",
"Vat_Type": 1,
"Address1": "δεν",
"City1": "no city",
"Country1_ID": 1,
"Discount_Perc": 0,
"KEPYO_Type": 0,
"KEPYO_Flag": 0,
"Active": true,
"Acc_Code": "30.00.01",
"luCountry1Name": "ΕΛΛΑΔΑ",
"BranchID": 99,
"ValBehave": 0,
"ValuerDays": 0,
"CompType": 0,
"HeadOffice": 1960027845,
"CusHeadCode": "json2",
"CusHeadName": "json επωνυμία",
"Creation_Date": "2022-10-16T09:09:28",
"GLCodeBuildType": 0,
"CreditValAsPay": true,
"ChqGrpCodeID": 1,
"ChqType": 1,
"ChqMove": 10,
"calcChqAuto": false,
"calcChqMoveTrn": false,
"calcChqChoice": true,
"calcChangeOwner": true,
"calcChangeRemainAsIS": false,
"calcChangePayDate": false,
"isTransf": true,
"isRetailFund": 0,
"FundCreDeb": 0,
"CoinCodeID": 1,
"ValidFromDate": "2000-01-01",
"ValidToDate": "9999-01-01",
"BalancedTrn": false,
"UpdateItemAllMaster": true,
"DoOpenItem": 0,
"OpenItemBehavior": false,
"HandleFC": false,
"MoveType": true,
"Priority": 0,
"BillToAmID": 1960027845,
"BillToCode": "json2",
"BillToName": "json επωνυμία",
"PrPolicyUseShipTo": false,
"DoEInvoice": false,
"DeliveryPriority": 0,
"eMarketing": 0,
"BaseAGrpByID": 2,
"MSH_Not_LogoURL_inLabels": false
}
body
{
"bo": "TCustomerbo",
"data": [
{
"code": "json2",
"name": "json επωνυμία",
"Profession": "a",
"Address1": "δεν",
"city1": "no city",
"#echo": "e"
},
{
"code": "json3",
"name": "json επωνυμία",
"Profession": "a",
"Address1": "δεν",
"city1": "no city"
},
{
"code": "json4",
"name": "json επωνυμία",
"Profession": "a",
"Address1": "δεν",
"city1": "no city",
"#echo": "d"
}
]
}
return[
{
"#echo": "e",
"ID": 1960027845
},
{
"ID": 1960027846
},
{
"ID": 1960027847
},
{
"ID": 1960027848
},
{
"#echo": "d",
"ID": 1960027849
}
]
body
{
"sql": "select top 10 afm from customer where id>:0 order by id",
"usenulls": true,
"params": [
3007
]
}
return always an array of values
[
"036611318",
"0000000",
"000000",
"X-00.0002",
"X-00.0003",
"X-00.0004",
"X-00.0005",
"X-00.0006",
"X-00.0007",
"X-00.0008"
]
body
{
"sql": "select top 10 id,code,name from customer where id>:0 order by id",
"addnulls": false,
"params": [
3007
]
}
return always an array of objects (rows)
[
{
"id": 1960020580,
"code": "30.0",
"name": "ΜΕΝΤΖΕΛΙΔΗΣ ΜΙΛΤΟΣ ΑΕ"
},
{
"id": 1960021364,
"code": "301",
"name": "Καραγκικας δημ"
},
{
"id": 1960021365,
"code": "302",
"name": "Καραμολεγκος Τακης"
},
{
"id": 1960021366,
"code": "00.0002",
"name": "ΑΓΡΙΟΓΙΑΝΝΗ ΕΛΕΝΗ ΤΟΥ ΝΙΚΟΛΑΟΥ"
},
{
"id": 1960021367,
"code": "00.0003",
"name": "ΑΝΤΩΝΙΟΥ ΔΗΜΗΤΡΙΟΣ ΤΟΥ ΗΛΙΑ"
},
{
"id": 1960021368,
"code": "00.0004",
"name": "ΦΟΥΦΑΣ ΠΑΝ/ΤΗΣ ΤΟΥ ΣΑΡΑΝΤΟΥ"
},
{
"id": 1960021369,
"code": "00.0005",
"name": "SINGER PETER"
},
{
"id": 1960021370,
"code": "00.0006",
"name": "ΕΥΘΥΜΙΟΥ ΔΗΜΗΤΡΙΟΣ & ΑΙΚΑΤΕΡΙΝΗa"
},
{
"id": 1960021371,
"code": "00.0007",
"name": "ΤΣΙΟΥΛΟΣ ΔΗΜΟΣ"
},
{
"id": 1960021372,
"code": "00.0008",
"name": "ΝΙΚΗΤΟΠΟΥΛΟΥ"
}
]
body
return an object(if dbfqr<>true)
{
"sql": "declare @x varchar(max)=(select top 3 * from customer where id>:0 order by id for json auto) select @x",
"addnulls": false,
"dbfqr": true,
"params": [
3007
]
}
** dbFQR is optional FQR=Format Query Result.If true means service not convert result to json (“result format created in db”). Best practice is to use it with “for json” clause.return an object(if dbfqr<>true)
[
{
"code": "00.0002",
"name": "ΑΓΡΙΟΓΙΑΝΝΗ ΕΛΕΝΗ ΤΟΥ ΝΙΚΟΛΑΟΥ",
"afm": "X-00.0002"
},
{
"code": "00.0003",
"name": "ΑΝΤΩΝΙΟΥ ΔΗΜΗΤΡΙΟΣ ΤΟΥ ΗΛΙΑ",
"afm": "X-00.0003"
},
{
"code": "00.0004",
"name": "ΦΟΥΦΑΣ ΠΑΝ/ΤΗΣ ΤΟΥ ΣΑΡΑΝΤΟΥ",
"afm": "X-00.0004"
}
]
Επεξηγήσεις
- Το property BO παίρνει το όνομα του Topvalue Business Object όπου θα γίνει καταχώρηση.
- Τα data είναι array of rows (objects) ή object(row), χωρίς περιορισμούς. Μία καλή πρακτική είναι, το μέγεθος του body να μην ξεπερνάει το 1ΜΒ.
- Κάθε γραμμή (ως Js object) περιέχει ζεύγος πεδίων (όνομα πεδίου – τιμή πεδίου) όπως περιγράφεται στο ΒΟ του Topvalue. Μπορεί επίσης να περιέχει ειδικά πεδία (#rus, #echo)
- Προσοχή στη σειρά που εμφανίζονται. το πεδίο #rus πρέπει να είναι πρώτο, όλα τα πεδία του ΒΟ όπως εμφανίζονται στο JSON. Τα ένθετα σύνολα να είναι στο τέλος.
-
Πεδίο #rus (row update status)
- 0=insert is default,
- 1=update,
- 2=delete.
- Κάθε γραμμή (object) μπορεί να έχει το πεδίο #rus αλλά πρέπει να είναι πρώτο στη σειρά.
- Πεδίο #echo. Είναι ένα πεδίο χρήστη που μπορεί να υπάρχει σε κάθε master σειρά, εάν υπάρχει θα επιστρέψει από το service όπως ελήφθη. Η βέλτιστη πρακτική είναι να το χρησιμοποιήσετε για να συγκρίνεται τα κλειδιά με αυτά του Topvalue
-
Η επιστροφή που λαμβάνουμε όταν κάνουμε request ApplyBOData είναι οι εξής:
- #rus=0 (insert): Ένα object που περιέχει το #echo (εάν υπάρχει) και τα ID ή το σφάλμα σε περίπτωση λάθους.
- #rus=1 (update): Ένα object που περιέχει το #echo (εάν υπάρχει) ή το σφάλμα σε περίπτωση λάθους.
- #rus=2 (delete): Ένα object που περιέχει το #echo (εάν υπάρχει) ή το σφάλμα σε περίπτωση λάθους.