C# > Networking > HTTP and Sockets > TcpClient and TcpListener

Sending HTTP Requests with HttpClient

This snippet demonstrates how to use HttpClient to send HTTP GET and POST requests to a server and handle the responses.

Concepts Behind the Snippet

HttpClient is a class in C# used to send HTTP requests and receive HTTP responses from a resource identified by a URI. It supports various HTTP methods like GET, POST, PUT, DELETE, etc. The snippet showcases the basics of sending GET and POST requests and handling the response status codes and content.

HTTP GET Request Example

This code sends an HTTP GET request to the specified URL. The GetAsync method sends the request asynchronously. The EnsureSuccessStatusCode method throws an exception if the response status code is not in the range of 200-299 (success). The response content is read as a string using ReadAsStringAsync.

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class HttpClientExample
{
    public static async Task Main(string[] args)
    {
        using (HttpClient client = new HttpClient())
        {
            try
            {
                HttpResponseMessage response = await client.GetAsync("https://jsonplaceholder.typicode.com/todos/1");
                response.EnsureSuccessStatusCode(); // Throw exception if status code is not 200-299
                string responseBody = await response.Content.ReadAsStringAsync();
                Console.WriteLine(responseBody);
            }
            catch (HttpRequestException e)
            {
                Console.WriteLine("Exception Caught! Message :{0} ", e.Message);
            }
        }
    }
}

HTTP POST Request Example

This code sends an HTTP POST request to the specified URL with a JSON payload. The StringContent class is used to create the request body. The PostAsync method sends the POST request asynchronously. The response is handled similarly to the GET request example.

using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

public class HttpClientPostExample
{
    public static async Task Main(string[] args)
    {
        using (HttpClient client = new HttpClient())
        {
            try
            {
                // Prepare the content to send
                string jsonPayload = "{\"userId\": 1, \"title\": \"Sample Todo\", \"completed\": false}";
                StringContent content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");

                // Send the POST request
                HttpResponseMessage response = await client.PostAsync("https://jsonplaceholder.typicode.com/todos", content);

                // Ensure we got a success code
                response.EnsureSuccessStatusCode();

                // Read the response content
                string responseBody = await response.Content.ReadAsStringAsync();
                Console.WriteLine(responseBody);
            }
            catch (HttpRequestException e)
            {
                Console.WriteLine("Exception Caught! Message :{0} ", e.Message);
            }
        }
    }
}

Real-Life Use Case

HttpClient is used extensively in modern applications for: * **API Integration:** Communicating with web services and APIs. * **Web Scraping:** Retrieving data from websites. * **Microservices Communication:** Exchanging data between different microservices. * **Cloud Services:** Interacting with cloud platforms like Azure and AWS.

Best Practices

When using HttpClient, follow these best practices: * **Use a Singleton HttpClient Instance:** Creating a new HttpClient instance for each request can exhaust available sockets. Reuse a single instance for the lifetime of the application or use IHttpClientFactory to manage HttpClient instances. * **Dispose of Responses:** Always dispose of the HttpResponseMessage and HttpContent when you are finished with them to release resources. The using statement handles this automatically. * **Handle Exceptions:** Implement proper exception handling to catch potential HttpRequestException errors and handle them gracefully. Implement retry policies for transient errors. * **Set Timeouts:** Configure timeouts to prevent requests from hanging indefinitely. * **Use Asynchronous Operations:** Use asynchronous methods (e.g., GetAsync, PostAsync) to avoid blocking the main thread. * **Properly Handle HTTP Status Codes:** Check the StatusCode property of the HttpResponseMessage and handle different status codes appropriately. Use EnsureSuccessStatusCode for simple success checking.

Interview Tip

Be prepared to discuss the different HTTP methods (GET, POST, PUT, DELETE, etc.) and their use cases. Also, understand the concept of HTTP status codes and how to handle them in your code. Know the difference between synchronous and asynchronous HTTP requests and the benefits of using asynchronous operations.

When to Use Them

Use HttpClient whenever you need to interact with web services or APIs over HTTP. It is the standard way to make HTTP requests in C# applications.

Memory Footprint

The memory footprint of HttpClient depends on the size of the request and response messages. Large responses can consume significant memory. Use streaming to handle large responses efficiently.

Alternatives

Alternatives to HttpClient include: * **WebRequest/HttpWebRequest:** Older classes for making HTTP requests, but generally less preferred than HttpClient. * **RestSharp:** A popular third-party library for simplifying REST API interactions. * **Flurl:** Another popular third-party library offering a fluent interface for building HTTP requests.

Pros

* Modern and flexible API for making HTTP requests. * Supports various HTTP methods and features. * Built-in support for asynchronous operations.

Cons

* Requires careful management of the HttpClient instance to avoid socket exhaustion. * Can be more verbose than some third-party libraries.

FAQ

  • How do I set a timeout for an HttpClient request?

    You can set the timeout using the Timeout property of the HttpClient instance. For example: client.Timeout = TimeSpan.FromSeconds(30);
  • How do I send custom headers with an HttpClient request?

    You can add custom headers to the HttpRequestHeaders collection of the HttpClient instance. For example: client.DefaultRequestHeaders.Add("X-Custom-Header", "value");
  • How do I handle different content types in an HttpClient response?

    You can check the ContentType property of the HttpContent and use appropriate methods to read the content. For example, use ReadAsStringAsync for text-based content and ReadAsByteArrayAsync for binary content.