Си шарп get запрос

Использование Visual C# для выполнения запроса GET

В этой статье описывается, как GET выполнить запрос на получение веб-страницы из Интернета с помощью Visual C#.

Оригинальная версия продукта: Visual Studio
Исходный номер базы знаний: 307023

Аннотация

Microsoft платформа .NET Framework содержит множество полезных классов для сетевых подключений, включая возможность выполнения веб-запросов.

В этой статье рассматриваются следующие платформа .NET Framework имен библиотеки классов:

Требования

В следующем списке приведены рекомендуемые оборудование и программное обеспечение, которые вам нужны:

Если вы используете прокси-сервер, для проверки кода в этой статье необходимо иметь внутренний веб-адрес или статические значения прокси-сервера ( см. шаги 5 и 6 раздела «Запрос веб-страницы»).

Запрос веб-страницы

Возможность программного получения веб-страницы имеет множество вариантов использования. Эта возможность была предоставлена программистам Visual Basic с помощью управления передачей через Интернет или путем прямого написания кода для API Windows Internet (WinINet).

В .NET System.Net WebRequest пространства имен предоставляют класс для инкапсуляции запроса к интернет-ресурсу и WebResponse класс для представления возвращаемых данных.

С помощью этих объектов можно получить поток, представляющий ответ для конкретного запроса. Если у вас есть поток, вы можете прочитать ответ так же, как вы читаете из локального текстового файла или из любого другого источника.

Чтобы выполнить запрос GET , выполните следующие действия.

  1. Запустите Visual Studio.
  2. Создайте консольное приложение в Visual C#. Visual Studio автоматически создает открытый класс и пустой Main метод.
  3. Убедитесь, что проект ссылается по крайней мере наSystem.dll.
  4. Используйте директиву using System для пространства имен, System.NET System.IO пространства имен и пространства имен (для объектов потока), чтобы вам не нужно было уточнять объявления из этих пространств имен позже в коде. Эти инструкции должны использоваться перед любыми другими объявлениями.
using System; using System.Net; using System.IO; 
string sURL; sURL = "http://www.contoso.com"; 
WebRequest wrGETURL; wrGETURL = WebRequest.Create(sURL); 
WebProxy myProxy = new WebProxy("myproxy",80); myProxy.BypassProxyOnLocal = true; wrGETURL.Proxy = myProxy; 
wrGETURL.Proxy = WebProxy.GetDefaultProxy(); 

Примечание. В Visual Studio 2005 или Visual Studio 2008 GetDefaultProxy этот метод работает. Однако этот метод устарел. Дополнительные сведения о GetDefaultProxy методе в платформа .NET Framework 2.0 см. в статье платформа .NET Framework версии 2.0 «Устаревший тип или список элементов (по сборке)».

Stream objStream; objStream = wrGETURL.GetResponse().GetResponseStream(); 
StreamReader objReader = new StreamReader(objStream); string sLine = ""; int i = 0; while (sLine != null) < i++; sLine = objReader.ReadLine(); if (sLine != null) Console.WriteLine(":", i, sLine); > Console.ReadLine(); 

Полный список кода

using System; using System.Net; using System.IO; namespace MakeAGETRequest_charp < /// /// Summary description for Class1. /// class Class1 < static void Main(string[] args) < string sURL; sURL = "http://www.contoso.com"; WebRequest wrGETURL; wrGETURL = WebRequest.Create(sURL); WebProxy myProxy = new WebProxy("myproxy", 80); myProxy.BypassProxyOnLocal = true; wrGETURL.Proxy = WebProxy.GetDefaultProxy(); Stream objStream; objStream = wrGETURL.GetResponse().GetResponseStream(); StreamReader objReader = new StreamReader(objStream); string sLine = ""; int i = 0; while (sLine != null) < i++; sLine = objReader.ReadLine(); if (sLine != null) Console.WriteLine(":", i, sLine); > Console.ReadLine(); > > > 

Обратная связь

Были ли сведения на этой странице полезными?

Источник

Учебник по созданию HTTP-запросов в консольном приложении .NET на C#

В этом учебнике рассказывается, как создать приложение, которое отправляет HTTP-запросы к службе REST на GitHub. Приложение считывает информацию в формате JSON и преобразовывает ее в объекты C#. Преобразование из данных JSON в объекты C# называется десериализацией.

В этом учебнике вы научитесь следующему:

  • отправлять HTTP-запросы;
  • десериализовать JSON-ответы;
  • настраивать десериализацию с использованием атрибутов.

Если вы хотите поработать с примером окончательного кода по этому учебнику, вы можете загрузить такой пример. Инструкции по загрузке см. в разделе Просмотр и скачивание примеров.

Предварительные требования

  • Пакет SDK для .NET 6.0 или более поздней версии
  • Редактор кода, например [Visual Studio Code (кроссплатформенный редактор с открытым кодом). Пример приложения можно запускать в ОС Windows, Linux, macOS или в контейнере Docker.

Создание клиентского приложения

  1. Откройте командную строку и создайте каталог для приложения. Перейдите в этот каталог.
  2. Введите следующую команду в окне консоли:
dotnet new console --name WebAPIClient 

Создание HTTP-запросов

Это приложение вызывает API GitHub для получения сведений о проектах под зонтичным брендом .NET Foundation. Конечная точка имеет значение https://api.github.com/orgs/dotnet/repos. Для получения сведений создается HTTP-запрос get. Браузеры также используют HTTP-запросы get, поэтому вы можете указать этот URL-адрес в адресной строке браузера и увидеть, какие сведения вы будете получать и обрабатывать.

Используйте класс HttpClient, чтобы выполнять HTTP-запросы. HttpClient поддерживает только асинхронные методы для длительно выполняющихся API-интерфейсов. Следующие шаги позволяют создать асинхронный метод и вызывают его из метода Main.

    Откройте файл в каталоге Program.cs проекта и замените его содержимое следующим:

await ProcessRepositoriesAsync(); static async Task ProcessRepositoriesAsync(HttpClient client)
  • заменяет оператор Console.WriteLine вызовом ProcessRepositoriesAsync , в котором используется ключевое слово await .
  • Определяет пустой ProcessRepositoriesAsync метод.
using System.Net.Http.Headers; using HttpClient client = new(); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/vnd.github.v3+json")); client.DefaultRequestHeaders.Add("User-Agent", ".NET Foundation Repository Reporter"); await ProcessRepositoriesAsync(client); static async Task ProcessRepositoriesAsync(HttpClient client)
  • задает заголовки HTTP для всех запросов, а именно
    • Accept для приема ответов в формате JSON;
    • Название объекта User-Agent . Код сервера GitHub проверяет эти заголовки, они необходимы для извлечения сведений из GitHub;
     static async Task ProcessRepositoriesAsync(HttpClient client) < var json = await client.GetStringAsync( "https://api.github.com/orgs/dotnet/repos"); Console.Write(json); >
    • Ожидает задачу, возвращенную вызовом HttpClient.GetStringAsync(String) метода . Этот метод отправляет HTTP-запрос GET на указанный URI. В качестве текста ответа возвращаются данные типа String. Они доступны по завершении задачи;
    • Строка json ответа выводится в консоль.

    Десериализация результата JSON

    Шаги ниже позволяют преобразовать ответ в формате JSON в объекты C#. Используйте класс System.Text.Json.JsonSerializer, чтобы десериализовать данные JSON в объекты.

      Создайте файл с именем Repository.cs и добавьте следующий код:

    public record class Repository(string name); 
    await using Stream stream = await client.GetStreamAsync("https://api.github.com/orgs/dotnet/repos"); var repositories = await JsonSerializer.DeserializeAsync>(stream); 
    foreach (var repo in repositories ?? Enumerable.Empty()) Console.Write(repo.name); 
    using System.Net.Http.Headers; using System.Text.Json; 

    Настройка десериализации

    using System.Text.Json.Serialization; public record class Repository( [property: JsonPropertyName("name")] string Name); 
    • изменяет имя свойства name на Name ;
    • Добавляет , JsonPropertyNameAttribute чтобы указать, как это свойство отображается в JSON.
    foreach (var repo in repositories) Console.Write(repo.Name); 

    Рефакторинг кода

    Метод ProcessRepositoriesAsync может выполнять работу в асинхронном режиме и возвращает коллекцию репозиториев. Измените этот метод, чтобы вернуть Task> и переместите код, который записывает данные в консоль рядом с вызывающим.

      Измените сигнатуру ProcessRepositoriesAsync , чтобы этот метод возвращал задачу, результатом которой является список объектов Repository :

    static async Task> ProcessRepositoriesAsync() 
    await using Stream stream = await client.GetStreamAsync("https://api.github.com/orgs/dotnet/repos"); var repositories = await JsonSerializer.DeserializeAsync>(stream); return repositories ?? new(); 
    var repositories = await ProcessRepositoriesAsync(client); foreach (var repo in repositories) Console.Write(repo.Name); 

    Десериализация дополнительных свойств

    Следующие шаги добавляют код для обработки дополнительных свойств в полученном пакете JSON. Вы, вероятно, не будете обрабатывать каждое свойство, но добавление еще нескольких свойств позволит продемонстрировать другие возможности C#.

      Замените содержимое Repository класса следующим record определением:

    using System.Text.Json.Serialization; public record class Repository( [property: JsonPropertyName("name")] string Name, [property: JsonPropertyName("description")] string Description, [property: JsonPropertyName("html_url")] Uri GitHubHomeUrl, [property: JsonPropertyName("homepage")] Uri Homepage, [property: JsonPropertyName("watchers")] int Watchers); 
    foreach (var repo in repositories) < Console.WriteLine($"Name: "); Console.WriteLine($"Homepage: "); Console.WriteLine($"GitHub: "); Console.WriteLine($"Description: "); Console.WriteLine($"Watchers: "); Console.WriteLine(); > 

    Добавление свойства даты

    Дата последней операции push-уведомления в ответе JSON имеет следующий формат:

    Этот формат предназначен для времени в формате UTC, поэтому результатом десериализации является значение DateTime, свойство Kind которого равно Utc.

    Чтобы получить дату и время в вашем часовом поясе, вам необходимо написать пользовательский метод преобразования.

      В файле Repository.cs добавьте свойство для представления даты и времени в формате UTC и свойство только LastPush для чтения, которое возвращает дату, преобразованную в местное время. Файл должен выглядеть следующим образом:

    using System.Text.Json.Serialization; public record class Repository( [property: JsonPropertyName("name")] string Name, [property: JsonPropertyName("description")] string Description, [property: JsonPropertyName("html_url")] Uri GitHubHomeUrl, [property: JsonPropertyName("homepage")] Uri Homepage, [property: JsonPropertyName("watchers")] int Watchers, [property: JsonPropertyName("pushed_at")] DateTime LastPushUtc) < public DateTime LastPush =>LastPushUtc.ToLocalTime(); > 
    Console.WriteLine($"Last push: "); 
    using System.Net.Http.Headers; using System.Text.Json; using HttpClient client = new(); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/vnd.github.v3+json")); client.DefaultRequestHeaders.Add("User-Agent", ".NET Foundation Repository Reporter"); var repositories = await ProcessRepositoriesAsync(client); foreach (var repo in repositories) < Console.WriteLine($"Name: "); Console.WriteLine($"Homepage: "); Console.WriteLine($"GitHub: "); Console.WriteLine($"Description: "); Console.WriteLine($"Watchers: "); Console.WriteLine($""); Console.WriteLine(); > static async Task> ProcessRepositoriesAsync(HttpClient client) < await using Stream stream = await client.GetStreamAsync("https://api.github.com/orgs/dotnet/repos"); var repositories = await JsonSerializer.DeserializeAsync>(stream); return repositories ?? new(); > 

    Дальнейшие действия

    В этом руководстве вы создали приложение, которое выполняет веб-запросы и анализирует результаты. Теперь версия вашего приложения должна совпадать с полной версией примера.

    Источник

    Читайте также:  Sort function in cpp
Оцените статью