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.
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"}]'
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()) });
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?
4 Réponses :
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}
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
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 POSTLe 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.0Le résultat du test:
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.
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.
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.
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?
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
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/…