How to use GET method of Invoke-WebRequest to build a query string

后端 未结 2 2034
无人及你
无人及你 2021-02-15 16:22

Is there a standard way to make use of Invoke-WebRequest or Invoke-RestMethod in PowerShell to get information from a web page using a query string?

For example, I know

相关标签:
2条回答
  • 2021-02-15 16:25

    The following appears to work reasonably well as a "first cut". Thanks to @briantist for the key point which was to use the .NET HttpValueCollection. It seems we have to "roll our own" way of building the query string.

    The below code snip shows a simple way to transform the hash table containing parameters and values in to a well formed query string by simply traversing the hash table. One limitation is that nesting is not permitted (a parameter value cannot be a complex type such as a hash table).

    # Setup, parameters is now a PowerShell hash table
    # we convert that on the fly to an appropriate URL
    $Parameters = @{
        Name = 'John'
        Children = 'Abe','Karen','Jo'
    }
    $Uri = 'http://example.com/somepage.php'
    $AddSquareBracketsToArrayParameters = $true
    
    
    
    $HttpValueCollection = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)
    foreach ($Item in $Parameters.GetEnumerator()) {
        if ($Item.Value.Count -gt 1) {
            # It is an array, so treat that as a special case.
            foreach ($Value in $Item.Value) {
                # Add each item in the array, optionally mark the name of the parameter
                # to indicate it is an array parameter.
                $ParameterName = $Item.Key
                if ($AddSquareBracketsToArrayParameters) { $ParameterName += '[]' }                 
                $HttpValueCollection.Add($ParameterName, $Value)
            }
        } else {
            # Add the scalar value.
            $HttpValueCollection.Add($Item.Key,$Item.Value)
        }
    }
    # Build the request and load it with the query string.
    $Request  = [System.UriBuilder]($Uri)
    $Request.Query = $HttpValueCollection.ToString()
    
    # Now fire off the request.
    Invoke-WebRequest -Uri $Request.Uri
    
    0 讨论(0)
  • 2021-02-15 16:37

    It seems that the server running PHP is irrelevant here. I think you're asking how to send key/value pairs as query string parameters.

    If that's the case, you're in luck. Both Invoke-RestMethod and Invoke-WebRequest will take a [hashtable] in the body and construct your query string for you:

    $Parameters = @{
      Name = 'John'
      Children = 'Abe','Karen','Jo'
    }
    Invoke-WebRequest -Uri 'http://www.example.com/somepage.php' -Body $Parameters -Method Get # <-- optional, Get is the default
    

    Edit

    Now seeing that the issue is that you want a query string parameter to have multiple values, essentially an array, this rules out the data types you can pass to the body parameter.

    So instead, let's build the URI piece by piece first by starting with a [UriBuilder] object and adding on a query string built using an [HttpValueCollection] object (which allows duplicate keys).

    $Parameters = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)
    $Parameters['Name'] = 'John'
    foreach($Child in @('Abe','Karen','Joe')) {
        $Parameters.Add('Children', $Child)
    }
    
    $Request = [System.UriBuilder]'http://www.example.com/somepage.php'
    
    $Request.Query = $Parameters.ToString()
    
    Invoke-WebRequest -Uri $Request.Uri -Method Get # <-- optional, Get is the default
    
    0 讨论(0)
提交回复
热议问题