Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting a curl to PowerShell Invoke-WebRequest

I am trying to convert these two curl commands. I am just unsure on outputing the verbose. And if my cookie needs I2KBRCK=1. And how to do a header dump.

%CURL_FOLDER%\curl --verbose --insecure --cookie-jar %OUTPUT_FOLDER%\cookiejar.txt --cookie I2KBRCK=1 --data [email protected] --data password=pass --dump-header %OUTPUT_FOLDER%\headers_received_1.txt --output %OUTPUT_FOLDER%\curl_output_1.html --location https://website.com/action/doLogin  > %OUTPUT_FOLDER%\curl_verbose_output.txt 2>&1
%CURL_FOLDER%\curl --verbose --insecure --cookie %OUTPUT_FOLDER%\cookiejar.txt --form file1=@%TSV_UPLOAD_FILE% --form format="XYZ User License Upload" --form email=email.org --dump-header %OUTPUT_FOLDER%\headers_received_2.txt --output %OUTPUT_FOLDER%\curl_output_2.html https://website.com/something >> %OUTPUT_FOLDER%\curl_verbose_output.txt 2>&1

I converted the curl commands into this powershell.

$outFilePath = 'C:\Users\blah\Desktop\curl_output_1.html'
$outFilePathVerbose = 'C:\Users\blah\Desktop\curl_verbose_output.txt'

$secpasswd = ConvertTo-SecureString "password" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("[email protected]", $secpasswd)

Invoke-WebRequest -Uri "https://website.com/doLogin" -Credential $mycreds -Verbose -SessionVariable myWebSession -Method Post -OutFile $outFilePath 
Invoke-WebRequest -InFile $someFile -Uri "https://website.com/something" -Credential $mycreds -Verbose -WebSession $myWebSession -Method Post -OutFile $outFilePath

I tried to convert the second curl command into powershell another way and got a 404 error instead of a 500 error...

$body = @"
format = "XYZUser License Upload"
file1 = $FullPathTSVToSend
"@
$gist =  Invoke-WebRequest -Body $body   -Uri "https://website.com/action/directSubscriptionUpload"  -Credential $mycreds -Verbose -WebSession $myWebSession -OutFile $outFilePath -Method Post   -ContentType "multipart/form-data" 

I edited with powershell with the new code that you suggested...

$content = Get-Content  $FullPathTSVToSend
$body = @{ 'format' = "XYZUser License Upload"; 'file1' = $( $content); 'email' ="[email protected]"  }
Invoke-WebRequest -Uri "https://website.com/doLogin" -Credential $mycreds -Verbose -SessionVariable myWebSession -Method Post -OutFile $outFilePath 
Invoke-WebRequest -Body $body -Uri "https://website.com/something" -Credential $mycreds -Verbose  -OutFile $outFilePath2 -Method Post -ContentType "multipart/form-data" -WebSession $myWebSession 

However, I am still getting the 404 error for the second Invoke-WebRequest. I think maybe there is something else I need to pass from the first Invoke-WebRequest command. But the myWebSession should have that cookie I2KBRCK=1 from the first curl command.

like image 516
Takafu Keyomama Avatar asked Aug 24 '17 18:08

Takafu Keyomama


People also ask

Is invoke-WebRequest the same as curl?

curl in PowerShell uses Invoke-WebRequest . From PowerShell 3.0 and above, you can use Invoke-WebRequest , which is equivalent to curl .

How do I run a curl command in PowerShell?

The conclusion is that if you need to use the curl (as same as in the Windows command prompt) in PowerShell then you need to call the curl executable( curl.exe ) directly. Else, you should stick to the PowerShell curl alias which resolves to the Invoke-WebRequest cmdlet under the hood.

What is invoke-WebRequest in PowerShell?

The Invoke-WebRequest cmdlet sends HTTP, HTTPS, FTP, and FILE requests to a web page or web service. It parses the response and returns collections of forms, links, images, and other significant HTML elements. This cmdlet was introduced in Windows PowerShell 3.0.

What is the difference between invoke RestMethod and invoke-WebRequest?

Invoke-RestMethod is perfect for quick APIs that have no special response information such as Headers or Status Codes, whereas Invoke-WebRequest gives you full access to the Response object and all the details it provides.


1 Answers

You need to put the form parameters into a hash and make sure you have the content of the file, not the file name, in the request.

Try:

$body = @{ format = "XYZUser License Upload"; file1 = $(gc $FullPathTSVToSend) }
Invoke-WebRequest -Body $body -Uri "https://website.com/action/directSubscriptionUpload" -Credential $mycreds -Verbose -WebSession $myWebSession -OutFile $outFilePath -Method Post -ContentType "multipart/form-data"
like image 138
arco444 Avatar answered Nov 08 '22 15:11

arco444