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
HttpClientrequest?
You can set the timeout using theTimeoutproperty of theHttpClientinstance. For example:client.Timeout = TimeSpan.FromSeconds(30); -
How do I send custom headers with an
HttpClientrequest?
You can add custom headers to theHttpRequestHeaderscollection of theHttpClientinstance. For example:client.DefaultRequestHeaders.Add("X-Custom-Header", "value"); -
How do I handle different content types in an
HttpClientresponse?
You can check theContentTypeproperty of theHttpContentand use appropriate methods to read the content. For example, useReadAsStringAsyncfor text-based content andReadAsByteArrayAsyncfor binary content.