VSTS REST refs API для создания ветки GIT

Согласно документации MS, API-интерфейс refs для VSTS должен позволять вам создавать новую ветку из определенного коммита, но я не могу заставить его работать. Вот код POC, который у меня есть (в PowerShell):

$uri = 'https://{account}.visualstudio.com/{project}/_apis/git/repositories/{repository}/refs?api-version=1.0';

[array]$requestList = @();
$requestObj = New-Object -TypeName psobject;
$requestObj | Add-Member -MemberType NoteProperty -Name "name" -Value 'refs/heads/api-branch1';
$requestObj | Add-Member -MemberType NoteProperty -Name "oldObjectId" -Value "0000000000000000000000000000000000000000";
$requestObj | Add-Member -MemberType NoteProperty -Name "newObjectId" -Value "272c5f931889e5c6cc61a6fdb19ad00eeebf2d77";
$requestList += @($requestObj);

$header = Get-AuthHeader;
$body = ConvertTo-Json -InputObject @($requestList);
Write-Host $body;

$response = Invoke-RestMethod -Uri $uri -Headers $header -Method Post -Body $body -ContentType application/json;

Write-Host $response;

Тело запроса отформатировано правильно, как сообщает оператор Write-Host, и я убедился, что newObjectId является правильным идентификатором фиксации. Однако, когда я запускаю скрипт, я получаю следующую ошибку:

Invoke-RestMethod : {"$id":"1","innerException":null,"message":"Value cannot be null.\r\nParameter name: refUpdates","typeName":"System.ArgumentNullException, mscorlib, Version=14.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089","typeKey":"ArgumentNullException","errorCode":0,"eventId":0}
At C:\Users\gappleton\Documents\VSTS\Scripts\Test-Methods.ps1:119 char:13
+ $response = Invoke-RestMethod -Uri $uri -Headers $header -Method Post ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

Кто-нибудь использовал этот API для успешного создания новой ссылки (ветви или тега), и если да, то можете ли вы помочь мне определить, что я делаю неправильно? Ниже приведена ссылка на документацию MS по API, и заранее спасибо за любую помощь, которую вы можете предоставить!

Git Refs: документация по VSTS REST API


person Glen    schedule 14.07.2017    source источник


Ответы (1)


Нашел и исправил в своем примере кода. Две вещи, которые следует учитывать, чтобы сделать эту работу. Во-первых, если вы используете PSObject и конвертируете его в JSON, не используйте вертикальную черту "|" метод преобразования, поскольку он будет сглаживать массивы из 1 элемента в немассив. Если тело запроса не содержит коллекции/массива (квадратные скобки), он не сможет прочитать запрос.

$body = $requestList | ConvertTo-Json | Out-String; # Flattens one element array
$body = ConvertTo-Json -InputObject @($requestList); # Does not flatten

Во-вторых, при тестировании вашего кода убедитесь, что вы передаете преобразованную строку JSON, а не PSObject в теле запроса (это был момент «DOH!» с моей стороны). Этот пример кода на самом деле работает для создания новой ветки из идентификатора коммита, как только вы соответствующим образом замените информацию в квадратных скобках в uri:

$uri = 'https://{account}.visualstudio.com/{project}/_apis/git/repositories/{repository}/refs?api-version=1.0';

[array]$requestList = @();
$requestObj = New-Object -TypeName psobject;
$requestObj | Add-Member -MemberType NoteProperty -Name "name" -Value 'refs/heads/api-branch1';
$requestObj | Add-Member -MemberType NoteProperty -Name "oldObjectId" -Value "0000000000000000000000000000000000000000";
$requestObj | Add-Member -MemberType NoteProperty -Name "newObjectId" -Value "272c5f931889e5c6cc61a6fdb19ad00eeebf2d77";
$requestList += @($requestObj);

$header = Get-AuthHeader;
$body = ConvertTo-Json -InputObject @($requestList);
Write-Host $body;

$response = Invoke-RestMethod -Uri $uri -Headers $header -Method Post -Body $body -ContentType application/json;

Write-Host $response;
person Glen    schedule 14.07.2017