Gravatar C# API

Gravatar C# API

Introduction

Several years ago, around 2015, I needed a way to get some basic profile information for users in an app I did. I decided to use Gravatar because they let you get some basic user information if you just pass them an email address.

The library is pretty simple, it just uses a HttpClient to call Gravatar and translate the response into a C# object. Back then I (and many other developers) mistakenly thought that HttpClient was supposed to be disposed after each usage mainly because it exposes the IDisposable interface and as a good .net developer you have learned to always dispose your resources when you no longer need them, more on that in this Visual Studio Magazine article.

So, now it's 2021 and I wanted to use the API in a new Azure Function (a post on that coming up shortly) and of course wanted to update the API to use HttpClient correctly. Thus I made an update to it.

The Gravatar C# API

I have put the code in this public Github repository. I have also published the library as a Nuget for you to include in your projects:

Install-Package GravatarSharp.Core -Version 0.9.0.2

Implementation

There are 2 features in the library; getting the user profiel and getting the profile image.

Get Image Url from Gravatar

Here is how to get the image url for a given email:

/// <summary>
///     Gets the Gravatar image url for the given user/email
/// </summary>
/// <param name="email">The email that will be used to request the user image url</param>
/// <param name="width">The width in pixels. Default is 128</param>
/// <returns>The image url corresponding to the provided email address</returns>
public static string GetImageUrl(string email, int width = 128)
{
    return $"http://www.gravatar.com/avatar/{Hashing.CalculateMd5Hash(email)}?s={width}&d=identicon&r=PG";
}

As you might have noticed, this is hashing the email, because that is what Gravatar accepts, this is done like so:

/// <summary>
///     Calculate the hash based on this MSDN post:
///     http://blogs.msdn.com/b/csharpfaq/archive/2006/10/09/how-do-i-calculate-a-md5-hash-from-a-string_3f00_.aspx
/// </summary>
/// <param name="input">The input to hash</param>
/// <returns>The hashed and lowered string</returns>
public static string CalculateMd5Hash(string input)
{
    // step 1, calculate MD5 hash from input
    var md5 = MD5.Create();
    var inputBytes = Encoding.ASCII.GetBytes(input);
    var hash = md5.ComputeHash(inputBytes);

    // step 2, convert byte array to hex string
    var sb = new StringBuilder();
    foreach (var t in hash) sb.Append(t.ToString("X2"));
    return sb.ToString().ToLower();
}

Get User Profile from Gravatar

The second feature is to get the user info that Gravatar has on a given email:

/// <summary>
/// Gets the Gravatar profile for the given user/email
/// </summary>
/// <param name="email">The email that will be used to request the user profile</param>
/// <returns>The user profile corresponding to the provided email address</returns>
public async Task<GetProfileResult> GetProfile(string email)
{
    var json = await GetStringResponse($"https://en.gravatar.com/{Hashing.CalculateMd5Hash(email)}.json");
    if (string.IsNullOrEmpty(json.ErrorMessage))
        return new GetProfileResult
        {
            Profile = new GravatarProfile(JsonConvert.DeserializeObject<Profile>(json.Result), json.Result)
        };
    return new GetProfileResult
    {
        ErrorMessage = json.ErrorMessage
    };
}

Here we just append .json to the request url and then Gravatar will return a JSON file which the library then translate into a C# object for you to use.

Remember, you can see the full source code of this library:

Thanks for reading, please let me know if you find this useful or if you have any other feedback. I would love to get your comments!

Also, stay tunes, I will soon post an article on how to use this library in an Azure Function especially how to use dependency injection to inject the HttpClient.

Did you find this article valuable?

Support Nicklas Møller Jepsen by becoming a sponsor. Any amount is appreciated!