我已经成功地通过WebClient对象从Artifactory(通用回购)下载了一个文件。 我有麻烦上传文件通过相同的方法。 我试图找出通过Powershell上传到我们的服务器的最简单的方法。
请注意,安装Curl等其他工具目前不是一个选项。 我正在编写自动化脚本,并且希望坚持使用基本的Windows 2008 R2服务器,不要安装其他实用程序,因为我不能指望所有服务器都存在。
如果有人使用Rest API的示例脚本,那将是完美的!
下载代码的例子(这工作):
$SOURCE = "https://artifactory.example.com/artifactory/net-generic-local/APP/BF_1.0.zip" $DESTINATION = ".\BF_1.0.zip" $AF_USER ="user" $AF_PWD ="password" $WebClient = New-Object System.Net.WebClient $WebClient.Credentials = New-Object System.Net.NetworkCredential($AF_USER,$AF_PWD) $WebClient.DownloadFile($SOURCE,$DESTINATION)
这是上传代码的一个例子(不起作用):
$SOURCE = ".\BF_2.0.zip" $DESTINATION = "https://artifactory.example.com/artifactory/net-generic-local/APP/BF_2.0.zip" $AF_USER ="user" $AF_PWD ="password" $WebClient = New-Object System.Net.WebClient $WebClient.Credentials = New-Object System.Net.NetworkCredential($AF_USER, $AF_PWD) $URI = New-Object System.Uri($DESTINATION) $WebClient.UploadFile($URI,$SOURCE)
这是我从上传中得到的错误:
Exception calling "UploadFile" with "2" argument(s): "The remote server returned an error: (405) Method Not Allowed." At E:\transient\af_put.ps1:8 char:1 + $WebClient.UploadFile($URI,$SOURCE) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : WebException
我尝试了Invoke-WebRequest选项,并能够得到这个工作:
$URI = New-Object System.Uri("https://artifactory.example.com/artifactory/net-generic-local/APP/BF_2.0.zip") $SOURCE = ".\BF_2.0.zip" $AF_USER = "user" $AF_PWD = ConvertTo-SecureString "password" -AsPlainText -Force $CREDS = New-Object System.Management.Automation.PSCredential ($AF_USER, $AF_PWD) Invoke-WebRequest -Uri $URI -InFile $SOURCE -Method Put -Credential $CREDS
必须创建一个PSCrendential对象,所以它不会提示输入用户密码。 但是除此之外,这个工作正如我所需要的那样。
我没有使用Artifactory,但是您可能想要尝试PowerShell v3和更高版本中的Invoke-RestMethod
PowerShell cmdlet。 这里有一个如何做到这一点的例子。
您将需要凭证,并根据其REST文档,使用Invoke-RestMethod
的-Credential
参数可以获得的类型的基本身份验证应该覆盖在那里。
你还需要提供一个消息$body
与您的请求。 从他们的文档看这里的JSON示例 ,然后编辑我给出的$body
作为起点。
$credential = Get-Credential $body = @{action="Upload";param2="Data";param3="Data";} | ConvertTo-Json Invoke-RestMethod -uri "http://localhost:8080/artifactory/api/build" ` -ContentType "application/json" -method POST -body $body -Credential
我必须说,这是我见过的REST API的更复杂的例子之一,所以为了使这更容易,我将curl安装在一台机器上,并使用Fiddler来成功上传文件来捕获跟踪。 为了使事情更容易,你也可以使用来自浏览器的Artifactory UI来上传文件,并简单地记录上传步骤的轨迹。 然后,抓住请求中的JSON,并以此为起点。