Nous avons installé sur notre serveur MS Dynamics 365 Business Central (je ne sais pas comment afficher la version actuellement installée). Nous utilisons le protocole oData v4 pour nos demandes.
Nous devons faire des appels API à ce système à partir de PHP
Il est impossible de faire des requêtes POST, PATCH, DELETE lorsque la requête GET fonctionne bien.
GET https://d365bc.vendor.com:7058/attain/ODataV4/Company('{{company}}')/Customer
Extension APIs: https://<base URL>:<port>/<serverinstance>/api/<API publisher>/<API group>/<API version>
SUPPRIMER https://d365bc.vendor.com:7058/attain/ODataV4/Company('{{company}}')/Customer(No='01121212 ')
{ "error": { "code": "BadRequest_MethodNotAllowed", "message": "'POST' requests for 'Customer' of EdmType 'Entity' are not allowed within Microsoft Dynamics 365 Business Central OData web services." } }
Je ne sais pas quelle est la syntaxe correcte pour la création (POST) ou la mise à jour (patch) Pour la demande POST, j'ai essayé de copier la valeur existante (prise de GET) et de la mettre dans le corps. Je reçois la réponse suivante:
{ "error": { "code": "BadRequest_MethodNotAllowed", "message": "Entity does not support insert." } }
Parfois, si je fais une demande absolument fausse, j'obtiens la réponse suivante:
{ "error": { "code": "BadRequest", "message": "Entity does not support delete." } }
Je ne peux pas appliquer les opérations CUD pour les clients, les produits. Cependant, pour les commandes, cela fonctionne.
Si je suis
Configuration et extensions / Configuration manuelle / Utilisateurs / [Sélectionner l'utilisateur]
Dans la section des autorisations, il y a trop de privilèges attribués. Parmi eux, il y a un élément de privilèges SUPER. Comme je le sais, tous les noms y sont personnalisés. Voici la capture d'écran des privilèges attribués.
J'ai essayé de suivre ce guide: https://docs.microsoft.com/en-us/dynamics-nav/api-reference/v1.0/
J'ai une installation sur site et pour moi, on ne sait pas quel est le bon point de terminaison pour toute opération.
Par exemple, je peux faire la demande suivante:
https://d365bc.vendor.com:7057/attain/WS/CRONUS%20International%20Ltd/Page/Customer
Et en conséquence, j'obtiens un schéma, mais pas des clients, ou la possibilité de faire des actions avec eux.
Si j'ai bien compris, ce guide contient des exemples d'installation dans le cloud uniquement.
{ "@odata.context": "https://d365bc.vendor.com:7058/attain/ODataV4/$metadata#Company('...')/Customer", "value": [ { "@odata.etag": "W/\"JzQ0O29EcmJmcGs4V3NRMHlEQ0Fxa0JxL1N0bi9xZjY5UDFQakZ0U2tBUGU1Kzg9MTswMDsn\"", "No": "01121212", "Name": "Spotsmeyer's Furnishings", "Responsibility_Center": "", "Location_Code": "YELLOW", "Post_Code": "US-FL 37125", "Country_Region_Code": "US", "Phone_No": "", "IC_Partner_Code": "", "Contact": "Mr. Mike Nash", "Salesperson_Code": "JR", "Customer_Posting_Group": "FOREIGN", "Gen_Bus_Posting_Group": "EXPORT", "VAT_Bus_Posting_Group": "EXPORT", "Customer_Price_Group": "", "Customer_Disc_Group": "", "Payment_Terms_Code": "1M(8D)", "Reminder_Terms_Code": "FOREIGN", "Fin_Charge_Terms_Code": "2.0 FOR.", "Currency_Code": "USD", "Language_Code": "ENU", "Search_Name": "SPOTSMEYER'S FURNISHINGS", "Credit_Limit_LCY": 0, "Blocked": " ", "Privacy_Blocked": false, "Last_Date_Modified": "2020-06-18", "Application_Method": "Manual", "Combine_Shipments": true, "Reserve": "Optional", "Shipping_Advice": "Partial", "Shipping_Agent_Code": "", "Base_Calendar_Code": "", "Balance_LCY": 0, "Balance_Due_LCY": 0, "Sales_LCY": 0, "Global_Dimension_1_Filter": "", "Global_Dimension_2_Filter": "", "Currency_Filter": "", "Date_Filter": "..11/13/20" }, { "@odata.etag": "W/\"JzQ0O08vNlVHSWVaZ1FGeG42d2JOa3k4Qm5uVHlkSGYzNk1ES2V5Y2E2S3hiekU9MTswMDsn\"", "No": "01445544", "Name": "Progressive Home Furnishings", "Responsibility_Center": "", "Location_Code": "YELLOW", "Post_Code": "US-IL 61236", "Country_Region_Code": "US", "Phone_No": "", "IC_Partner_Code": "", "Contact": "Mr. Scott Mitchell", "Salesperson_Code": "JR", "Customer_Posting_Group": "FOREIGN", "Gen_Bus_Posting_Group": "EXPORT", "VAT_Bus_Posting_Group": "EXPORT", "Customer_Price_Group": "", "Customer_Disc_Group": "RETAIL", "Payment_Terms_Code": "14 DAYS", "Reminder_Terms_Code": "FOREIGN", "Fin_Charge_Terms_Code": "2.0 FOR.", "Currency_Code": "USD", "Language_Code": "ENU", "Search_Name": "PROGRESSIVE HOME FURNISHINGS", "Credit_Limit_LCY": 0, "Blocked": " ", "Privacy_Blocked": false, "Last_Date_Modified": "2018-09-19", "Application_Method": "Manual", "Combine_Shipments": true, "Reserve": "Optional", "Shipping_Advice": "Partial", "Shipping_Agent_Code": "", "Base_Calendar_Code": "", "Balance_LCY": 1499.03, "Balance_Due_LCY": 1499.03, "Sales_LCY": 1499.03, "Global_Dimension_1_Filter": "", "Global_Dimension_2_Filter": "", "Currency_Filter": "", "Date_Filter": "..11/13/20" },
Est-ce que je fais tout correctement? Que signifient ces paramètres? Aucune explication fournie dans le guide.
Concernant les exigences:
L'API doit être activée sur l'instance de serveur Business Central:
Le port est donc 7057, l'URL de l'API est https://d365bc.vendor.com:7057/Attain/WS/
Qu'est-ce que WS, est-ce vraiment nécessaire? Par l'URL ci-dessus, j'obtiens ceci:
L'utilisateur utilisé pour l'authentification doit disposer d'une clé d'accès au service Web (créée pour l'utilisateur dans Business Central)
Il n'y avait rien dans cette section, j'ai ajouté une nouvelle clé. Et maintenant, ça ressemble à ça. Mais cela n'a rien changé dans mon cas. Toujours les mêmes erreurs: 405 pour le port 7057 et 404 pour le port 7058.
ps Suffit-il de le générer simplement? Ou devons-nous l'utiliser quelque part?
L'utilisateur doit disposer des autorisations requises dans Business Central pour les API pertinentes.
Gère-t-il à la page suivante?
L'URL a été modifiée après l'exécution avec le nom de fournisseur correct dans le nom de domaine.
3 Réponses :
Le point de terminaison OData est différent du point de terminaison API.
Je vous recommande d'utiliser l'API car c'est le moyen le plus à jour et le plus efficace d'interagir avec les données dans Business Central.
La documentation du point de terminaison de l'API peut être trouvée ici https://docs.microsoft.com/en-us/dynamics-nav/api-reference/v1.0/ , ainsi que quelques exemples tels que la mise à jour des clients, des éléments, etc.
Vous pouvez utiliser OData pour modifier les données, mais uniquement si l'objet sous-jacent qui pilote le point de terminaison est une page (par opposition à une requête) et doit être marqué avec InsertAllowed. Ceci est moins optimisé que le point de terminaison de l'API. https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/webservices/use-odata-to-modify-data
J'ai mis à jour un article (section upd1), pourriez-vous jeter un œil
Les paramètres sont les suivants:
La combinaison de l'URL de base, du port et de l'instance de serveur peut être située sous Services OData et le champ URL de base OData dans les paramètres du niveau de service Business Central.
Le point de terminaison de base que vous devez utiliser est (basé sur les informations que vous avez fournies):
// Version 13 https://d365bc.vendor.com:7058/Attain/api/beta/companies([company id here!])/customers // Version 14+ https://d365bc.vendor.com:7058/Attain/api/v1.0/companies([company id here!])/customers
Pour travailler avec les API, vous devez d'abord obtenir un identifiant pour l'entreprise - vous obtenez donc la liste des entreprises:
// Version 13 https://d365bc.vendor.com:7058/Attain/api/beta/companies // Version 14+ https://d365bc.vendor.com:7058/Attain/api/v1.0/companies
Avec votre identifiant d'entreprise, vous pouvez ensuite obtenir une liste de clients:
// Version 13 https://d365bc.vendor.com:7058/Attain/api/beta // Version 14+ https://d365bc.vendor.com:7058/Attain/api/v1.0
Vous utiliseriez le même point de terminaison pour POST ou PATCH en fournissant les données requises en tant que json dans le corps de la requête.
Exigences:
Commentaires:
Réponse à UPD.2:
Le port 7057 et https://d365bc.vendor.com:7057/Attain/WS/
sont destinés aux services Web SOAP et ne doivent pas être confondus avec l'API. Vous avez besoin du port 7058 comme indiqué sous l'onglet Services OData.
Pour attribuer une clé d'accès au service Web, vous devez accéder aux utilisateurs dans Business Central, trouver l'utilisateur en question et cliquer sur le bouton Change Web Service Key
.
Merci pour la réponse. Tout renvoie 405 Non autorisé. Où ces privilèges peuvent-ils être gérés?
J'ai ajouté une section sur les exigences.
Veuillez consulter la section Upd.2
J'ai ajouté une réponse à UPD.2.
d365bc.vendor.com:7058/attain/api/v1.0 renvoie 404
Vous devez utiliser la valeur de l'URL de base OData sous OData Services, puis ajouter api/v1.0
. Cela peut être sensible à la casse, donc attain
peut ne pas être identique à Attain
.
d365bc.----------.com:7058/Attain/api/v1.0 renvoie 404, d365bc.----------.com:7058/Attain renvoie 503
J'ai également ajouté deux captures d'écran avec des réponses. La clé générée où doit-elle être utilisée? Ou il devrait être simplement présent dans un compte personnel?
Avez - vous utilisé Attain
ou attain
pour l'appel avec api/v1.0
? De la capture d' écran , il vous semble utilisé attain
quand il devrait être Attain
.
J'ai utilisé les deux cas. Via Google Chrome et Postman également.
Quelle version de Business Central utilisez-vous?
Sry, je suis sous vide ... 13.0.24623.0
D'accord, alors vous devez remplacer v1.0
dans l'URL par beta
. L'utilisation de la v1.0
n'est possible qu'à partir de la version 14.
Quelques notes:
Vous devez d'abord récupérer les entités (Make 'Get'), puis lorsque vous avez besoin de mettre à jour ou de supprimer pour utiliser l'action correcte (PUT, DELETE) et également envoyer l'en-tête If-Match pour égaler la valeur de odata.etag comme ceci: If-Match : W / "JzQ0O0YxVTZnTlFpQ0NxbExDdmN0N2JGSDM2azN4dUhncEk1Nnl0MVhETGRIemc9MTswMDsn"
Concernant: https://d365bc.vendor.com:7058/attain/ODataV4/Company('{{company}}')/Customer(No='01121212 ') Ce n'est pas OData: / Customer (Non = vous devez utiliser eq au lieu du signe = Cependant, il est préférable d'utiliser l'ID (GUID) de l'enregistrement et vous devez fournir If-Match dans l'en-tête avec la valeur odata.etag