7
votes

MS Dynamics 365 Business Central. API POST, PATCH, DELETE ne fonctionne pas

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.

Tâche

Nous devons faire des appels API à ce système à partir de PHP

Problème

Il est impossible de faire des requêtes POST, PATCH, DELETE lorsque la requête GET fonctionne bien.

AVOIR

Demande:

GET https://d365bc.vendor.com:7058/attain/ODataV4/Company('{{company}}')/Customer

Réponse

Extension APIs:
https://<base URL>:<port>/<serverinstance>/api/<API publisher>/<API group>/<API version>

SUPPRIMER

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.

Privilèges existants

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.

entrez la description de l'image ici

UPD 1.

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.

Upd.2

Concernant les exigences:

L'API doit être activée sur l'instance de serveur Business Central:

entrez la description de l'image ici

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:

entrez la description de l'image ici

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.

entrez la description de l'image ici

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?

entrez la description de l'image ici

Voici des exemples de réponses:

entrez la description de l'image ici entrez la description de l'image ici

L'URL a été modifiée après l'exécution avec le nom de fournisseur correct dans le nom de domaine.

Je ne peux pas tout tester pour le moment, car je suis loin de mon ordinateur portable sous vide. Merci à tous pour le temps que vous m'avez accordé


0 commentaires

3 Réponses :


3
votes

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


1 commentaires

J'ai mis à jour un article (section upd1), pourriez-vous jeter un œil



2
votes

Les paramètres sont les suivants:

  1. URL de base: le nom du serveur par exemple d365bc.vendor.com
  2. port: le port utilisé pour OData par exemple 7058
  3. serverinstance: le nom de l'instance de serveur Business Central, par exemple atteindre
  4. Éditeur d'API: utilisé pour le regroupement d'API personnalisées (non requis lors de l'utilisation des API standard)
  5. Groupe d'API: utilisé pour le regroupement d'API personnalisées (non requis lors de l'utilisation des API standard)
  6. Version de l'API: utilisée pour regrouper les API personnalisées (non requise lors de l'utilisation des API standard)

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:

  1. L'API doit être activée sur l'instance de serveur Business Central
  2. 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)
  3. L'utilisateur doit disposer des autorisations requises dans Business Central pour les API pertinentes.

Commentaires:

  • Certaines des API ne prennent en charge que GET. Cela signifie que vous obtiendrez l'erreur 405 Non autorisé pour POST ou PATCH.
  • Vous devrez peut-être ajouter If-Match * aux en-têtes de requête pour les opérations PATCH.

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 .


13 commentaires

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.



2
votes

Quelques notes:

  1. 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"

  2. 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


0 commentaires