5
votes

API REST Azure DevOps - Créer un élément de travail - "Une valeur est requise"

J'essaie de créer un élément de travail à l'aide de l'API REST Azure DevOps. J'ai pu faire d'autres choses, comme exécuter une requête WIQL, mais lorsque j'essaie de créer un élément de travail, j'obtiens cette mystérieuse triple erreur:

Une valeur est requise mais n'était pas présente dans la demande
Une valeur est requise mais n'était pas présente dans la demande
Une valeur est requise mais n'était pas présente dans la demande

Voici la réponse complète.

const body = [
    { 
        "op":"add",
        "path":"/fields/System.Title",
        "value":"TestCreateWI"
    }
];

fetch(`${document.URL}/_apis/wit/workitems/$Task?&api-version=6.0`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json-patch+json',
  },
  body: JSON.stringify(body),
}).then(async (response) => {    
  console.log(await response.text())
});

Voici ce que j'essaye de faire, en suivant la documentation du mieux que je peux.

Cas de test minimal dans NodeJS

curl 'https://dev.azure.com/MyOrganization/MyProject/_apis/wit/workitems/$Task?&api-version=6.0' \
  -H 'Authorization: Basic [redacted]' \
  -H 'Content-Type: application/json-patch+json' \
  --data-binary '[{"op":"add","path":"/fields/System.Title","value":"Test"}]'

Même demande en utilisant CURL

const fetch = require('node-fetch');

const username = '[username]';
const password = '[personal access token]'
const organization = '[organization]';
const project = '[project]'

const authorizationHeader = `Basic ${Buffer.from(
    `${username}:${password}`
  ).toString('base64')}`

const body = [
    { 
        "op":"add",
        "path":"/fields/System.Title",
        "value":"TestCreateWI"
    }
];


  fetch(`https://dev.azure.com/${organization}/${project}/_apis/wit/workitems/$Task?&api-version=6.0`, {
    method: 'POST',
    headers: {
      Authorization: authorizationHeader,
      'Content-Type': 'application/json-patch+json',
    },
    body: JSON.stringify(body),
  }).then(async (response) => {    
    console.log(await response.text())
  });

Même demande d'un navigateur

Connectez-vous à DevOps pour que votre navigateur pointe vers https://dev.azure.com/YourProject/YourOrganization . Ensuite, ouvrez Dev Tools (F5) et collez ce code dans la console JS.

{
    "count": 1,
    "value": {
        "Message": "A value is required but was not present in the request.\r\nA value is required but was not present in the request.\r\nA value is required but was not present in the request.\r\n"
    }
}

Je sais que c'est la lecture de ma demande, car si je change "op" en une valeur invalide, j'obtiens une erreur différente. Qu'est-ce que je rate?


2 commentaires

J'ai obtenu un résultat similaire, des tests de PowerShell. Ce que vous avez semble correct et correspond à l'exemple de leur documentation. Vous pourriez simplement soulever un problème auprès de la communauté des développeurs : developercommunity.visualstudio.com/spaces/21/index.html


@ LeoLiu-MSFT J'ai également posté sur le site de la communauté des développeurs VS. Quelqu'un là-bas a rapporté les mêmes résultats et utilise également un script Powershell. Pouvez-vous essayer leur script et voir si vous obtenez une erreur? Cela nous dirait si le problème est dans leur code (et le mien) ou s'il y a un problème sur le serveur qui affecte certains comptes mais pas d'autres. (J'essaierais moi-même vos deux scripts, mais je suis sur un Mac.) Merci! developercommunity.visualstudio.com/content/problem/1249605/‌…


4 Réponses :


0
votes

Je n'utilise pas curl sur mes tâches, mais ce qui suit fonctionne sur mon organisation:

curl -u "":personal_access_token -d "[{\"op\":\"add\",\"path\":\"/fields/System.Title\",\"value\":\"Sample task\"}]" -H "Content-Type: application/json-patch+json" -X POST https://dev.azure.com/<org>/<project>/_apis/wit/workitems/${Task}?api-version=6.0 

J'ai testé curl pour Windows 7.73.0.

Documents pour créer un jeton d'accès personnel: utilisez des jetons d'accès personnels . De plus, utilisez le type d'élément de travail dans l'URL comme ${work item type name}

Si je publie des données avec -d '[{"op":"add","path":"/fields/System.Title","value":"Sample task"}]' le service renvoie la réponse suivante:

{"$ id": "1", "innerException": null, "message": "Vous devez transmettre un document correctif valide dans le corps de la requête.", "typeName": "Microsoft.VisualStudio.Services.Common. VssPropertyValidationException, Microsoft.VisualStudio.Services.Common "," typeKey ":" VssPropertyValidationException "," errorCode ": 0," eventId ": 3000}


1 commentaires

Merci d'avoir répondu. L'erreur concernant «document de correctif valide» est due au fait que vous n'avez pas échappé aux guillemets, donc l'objet JSON n'est pas valide. Puisque j'utilise --data-binary je n'ai pas besoin d'échapper aux guillemets. Je peux reproduire l'erreur que vous obtenez en mettant un "x" devant le JSON, le rendant invalide. Quoi qu'il en soit, le fait que cela fonctionne pour vous et que vous ne fassiez rien de différent suggère que le problème est spécifique à mon organisation. C'est au moins un peu utile. +1



-1
votes

API REST Azure DevOps - Créer un élément de travail - «Une valeur est requise»

Je pourrais utiliser les éléments de travail de l' API REST - Créer pour créer l'élément de travail avec la tâche Powershell dans mon pipeline:

$connectionToken="$(PAT)"
$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))

$url= 'https://dev.azure.com/MyCustomOrganization/MyTestProject/_apis/wit/workitems/$task?api-version=6.0'

$body=@"
  [
    {
      "op": "add",
      "path": "/fields/System.Title",
      "value": "TestCreateWI"
    }
 ]
"@

Write-Host "$url"
$response= Invoke-RestMethod -Uri $url  -ContentType "application/json-patch+json" -Body $body -headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method POST

Le corps de la requête est:

  [
    {
      "op": "add",
      "path": "/fields/System.Title",
      "value": "TestCreateWI"
    }
 ]

Voici mes scripts PowerShell:

POST https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/${type}?api-version=6.0

Le résultat du test:

entrez la description de l'image ici

entrez la description de l'image ici


2 commentaires

Merci. Je ne vois aucune différence à part que vous utilisez PowerShell. Je ne suis pas sous Windows, je ne peux donc pas essayer votre script. En fin de compte, je veux l'appel dans un script NodeJS. J'ai utilisé curl dans la question pour la réduire au cas de test le plus simple possible.


J'ai mis à jour ma question avec deux autres exemples. L'un utilise NodeJS et l'autre peut être exécuté dans DevTools dans un navigateur.



-1
votes

Vous pouvez essayer de remplacer ' par " deux côtés de l'URL dans votre script.

J'ai essayé le script PowerShell fourni dans le lien que vous avez fourni et j'ai réussi à reproduire l'erreur.

entrez la description de l'image ici

Après avoir changé le ' deux côtés de $uri en " , j'ai réussi à créer l'élément de travail.

De plus, lors de mes tests, j'ai utilisé %24 au lieu de $ dans l'URI, sinon une erreur serait signalée.

https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/%24{type}?api-version=6.0

PS. Mon environnement de test est Windows PowerShell.


1 commentaires

Merci. Je suis sur un Mac, donc je ne peux pas tester Powershell, mais j'ai essayé de remplacer $ par %24 . J'ai mis à jour ma question avec des exemples utilisant NodeJS et un navigateur. Pouvez-vous essayer de reproduire avec l'un de ces exemples?



1
votes

Vous avez une faute de frappe sur votre URL. J'ai dupliqué le comportement dans Postman et l'ai résolu en corrigeant l'URL. La plupart des autres réponses avec les appels «fonctionnant» dans PowerShell n'ont pas copié votre faute de frappe.

Vous avez spécifié https://dev.azure.com/${organization}/${project}/_apis/wit/workitems/$Task?&api-version=6.0

Il ne devrait pas avoir le supplément et avant la version api https://dev.azure.com/${organization}/${project}/_apis/wit/workitems/$Task?api-version=6.0


0 commentaires