Pull to refresh

Отправка запросов HTTP POST из PowerShell

PowerShell *
Прочитав топик Цитаты из forismatic.com в консоли (или fortune своими руками) из любопытства захотелось повторить тоже самое на PowerShell. Вот что получилось
function get-random-quote()
{
    $apiUrl = 'http://www.forismatic.com/api/1.0/'
    $client = new-object System.Net.WebClient
    $client.Headers.Add("Content-Type", "application/x-www-form-urlencoded")
    $client.Encoding = [System.Text.Encoding]::UTF8
    [xml]$quote = $client.UploadString($apiUrl, 'method=getQuote&format=xml' )
    $quote.forismatic.quote
}


Ниже пояснения и пример использования

Функция возврящает XML-объект цитату. Использовать так:
PS C:\Windows\system32> $quote = get-random-quote

______________________________________________________________________________________________________________________________________________________________________
PS C:\Windows\system32> $quote

quoteText                                  quoteAuthor                                senderName                                senderLink                               
---------                                  -----------                                ----------                                ----------                               
Каждый миг наслаждения — это дар богов.    Клод Адриан Гельвеций                                                                                                         
______________________________________________________________________________________________________________________________________________________________________
PS C:\Windows\system32> $quote.quoteAuthor
Клод Адриан Гельвеций


Пояснения небольшие:
  • Создаем .Net объект WebClient
  • Настраиваем его, прописывая заголовки и кодировку
  • Вызываем HTTP POST (если использовать UploadString c тремя параметрами, можно задать метод)
  • Конвертируем результирующую строку в XML
  • Выдираем из строки цитату


С моей точки зрения, здесь самое интересное — это преобразование в XML. В результате получается объект, с которым можно работать стандартными способаим PowerShell, например
$client = new-object System.Net.WebClient
$client.Encoding = [System.Text.Encoding]::UTF8
[xml]$habr = $client.DownloadString('http://habrahabr.ru/rss/9c1806bb61d9b6612943104ddbf830d9/')
$habr.rss.channel.item


Вернет коллекцию xml элементов типа:

title : title
guid : guid
link : habrahabr.ru/blogs/lenta/92187
description : description
pubDate : Tue, 27 Apr 2010 15:44:41 GMT
author : Mithgol
category : {военная техника, крылатые ракеты, Бирюза, Новатор...}

title : title
guid : guid
link : habrahabr.ru/blogs/startup/92152
description : description
pubDate : Tue, 27 Apr 2010 15:23:21 GMT
author : AynurEntre
category : {стартапы, монетизация, бизнес-модели, бизнес...}
....


Которую можно фильтровать, например вот так:

$habr.rss.channel.item | where { $_.author -eq 'mithgol' } | select link, category
Tags:
Hubs:
Total votes 14: ↑9 and ↓5 +4
Views 19K
Comments Leave a comment