Xamarin: Como crear incidencia en Jira Atlassian desde C# con API REST

Si necesitas que tu aplicación pueda crear una incidencia en Jira Atlassian con C# este articulo te será de mucha ayuda créeme.

No he calculado las horas que he invertido en investigar como poder crear una incidencia en Jira con c#, pero seguro que demasiadas.

No me gustaría que a nadie más le pasara la verdad. En el mundo de la programación solemos usar el concepto de re-utilización de código, y no hacer lo mismo una y otra vez.

Así que aporto mi granito de arena para todo aquel que haya tenido problemas para conectar su aplicación con Jira pueda conseguirlo en un momento.

Antes de nada te debo recomendar un programa. Es el que uso para realizar pruebas de api rest y conectarme con el exterior y enviar mi JSON. Si con dicho programa puedes crear una incidencia en Jira ya tienes la mitad del camino recorrido.

Este programa se llama POSTMAN y quizás lo conozcas ya, pero para el que no lo conoce, os resumo que hace.

Postman, es un cliente API con el que enviar solicitudes REST, SOAP y GraphQL. Y aunque hace muchas más cosas lo que a nosotros nos interesa es poder enviar una solicitud POST para crear una incidencia en Jira.

Como crear incidencia en jira con postman

Con Postman una vez configurado las credenciales de Jira podrás enviar un Json para hacer peticiones GET o POST como es nuestro caso.

Pero como este tema da para uno o varios artículos, vamos a partir con que tu ya usas postman o similar. Nos centraremos en que el único problema que tienes es que ahora necesitas que tu aplicación en C# o Xamarin pueda conectarse.

Vamos a partir de la base que tu ya tienes un proyecto creado, que hace lo que debe hacer, y que necesitas conectarte con JIRA. Vamos lo tienes todo para crear una incidencia en Jira pero no sabes como.

Crearemos dos método el primero sería algo como esto:

public static string CrearIncidenciaJira(string id, string description, string name)
        {
            string json = "{ \"fields\":{ \"project\":{ \"key\":\"Hola\",\"projectTypeKey\": \"servicios\"},\"summary\": \"Esto es una prueba APIREST\",\"issuetype\": { \"name\": \"Tas\" } } }";

            var userid = "tuUsuario@tudominio.com"; //Datos de ejemplo
            var password = "sfsdfrsdf4353f";
            var endpoint = "https://tuDominio.atlassian.net/rest/api/2/issue?";
            string jsonResponse = string.Empty;

            using (var client = new WebClient())
            {
                try
                {
                    client.Encoding = Encoding.UTF8;
                    client.Headers.Set("Authorization", "Basic " + GetEncodedCredentials(userid, password));
                    client.Headers.Add("Content-Type: application/json");
                    client.Headers.Add("Accept", "application/json");
                    Uri uri = new Uri(endpoint);
                    string response = client.UploadString(uri, json);

                    jsonResponse = response;
                }
                catch (WebException ex)
                {
                    // Http Error
                    if (ex.Status == WebExceptionStatus.ProtocolError)
                    {
                        HttpWebResponse wrsp = (HttpWebResponse)ex.Response;
                        var statusCode = (int)wrsp.StatusCode;
                        var msg = wrsp.StatusDescription;
                        //throw new HttpException(statusCode, msg);
                        Console.WriteLine(statusCode + " " + msg);
                    }
                    else
                    {
                        // throw new HttpException(500, ex.Message);
                        Console.Write(ex.Message);
                    }
                }
            }
            return jsonResponse;
        }

¿Pero qué demonios hace todo este código?

Tranquilo. Al principio asignamos a una cadena todo el JSON que vamos a enviar. Esto es algo personal de cada uno, depende de los campos que tenga tus incidencias, de como se llama tu proyecto, etc. Yo he colocado uno de ejemplo con datos ficticios para que lo comprendáis.

Muy importante es el tema de las comillas dobles. En C# no puedes asignar un Json como tal en una cadena porque no va a entender tantas comillas dobles. Así que debes poner delante de las comillas una barra \ y quitar todos los espacios vacíos innecesarios. Ojo si te equivocas en esta parte vas a recibir un error 400.

Después creamos 3 variables, dos de ellas tendrán el usuario y password del usuario con permisos para crear incidencias en Jira. La última variable es para usar un EndPoint o Url donde crear la incidencia de Jira. Normalmente esta url se compone de tu dominio de Jira tuDominio.atlasian.net seguido de /rest/api/2/issue? esto es así en casi todos los casos.

Después debes asignar las cabeceras de tu solicitud, aquí viene una parte importante. Jira no permite que le envíes la autorización BASIC sin antes codificar los datos, por eso NO hacemos esto:

client.Headers.Set("Authorization", "Basic fge4tgferg23rewf3w45wfd234");

Donde «Basic fge4tgferg23rewf3w45wfd234» sería la credencial. Jira lo quiere tal que así:

client.Headers.Set("Authorization", "Basic " + GetEncodedCredentials(userid, password));

donde el método GetEncodedCredentials se encargará de codificar las credenciales convirtiendo los datos a base 64 para que Jira no se queje. (más abajo enseño este método).

Seguimos. Después de las cabeceras se preparan las credenciales con el endPoint y el resto del código se encarga de comprobar que todo está correcto. De lo contrario te saca un mensaje con la excepción.

El segundo método lo deberás poner a continuación del otro tal que así:

private static string GetEncodedCredentials(string userid, string password)
        {
            string mergedCredentials = string.Format("{0}:{1}", userid, password);
            byte[] byteCredentials = UTF8Encoding.UTF8.GetBytes(mergedCredentials);
            return Convert.ToBase64String(byteCredentials);
        }

Con esto ya deberías poder crear una incidencia en Jira con C# desde tu aplicación, yo personalmente lo uso en Xamarin y tampoco tengo problemas.

Te recomiendo que eches un ojo al tema de Postman para asegurarte que tus credenciales son correctas y tu Json funciona correctamente. Y luego intentes hacerlo en C#.

Si te ha servido de ayuda te invito a puntuar el articulo con las estrellas de más arriba. Y comenta que tal te ha ido.

También te podría gustar...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *