2012-08-08 31 views
11

he escrito a continuación el código C# para acceder a la API JIRA Resto:JIRA Resto API inicia sesión usando C#

var url = new Uri("http://localhost:8090/rest/auth/latest/session?os_username=tempusername&os_password=temppwd"); 
var request = WebRequest.Create(url) as HttpWebRequest; 
if (null == request) 
{ 
return ""; 
} 
request.Method = "POST"; 
request.ContentType = "application/json"; 
request.ContentLength = 200; 
request.KeepAlive = false; 
using (var response = request.GetResponse() as HttpWebResponse) 
{ 
} 

Cuando ejecuto esto, la aplicación simplemente continúa funcionando sin devolver ninguna respuesta. Indique si esta es la forma correcta de llamar al inicio de sesión de JIRA mediante la API REST

+0

¿Por qué tiene un ContentType y ContentLength especificado? No veo ningún contenido/cuerpo real incluido en tu código. – Pete

+0

Usted dice que regresó sin ninguna respuesta, ¿su solicitud.GetResponse() arroja una excepción? Debería haber al menos algún tipo de respuesta del servidor web. – Joppe

Respuesta

29

Para la autenticación básica, debe enviar el nombre de usuario y la contraseña en una codificación base64. Directrices se pueden encontrar en los ejemplos de la API en atlassians página del desarrollador: https://developer.atlassian.com/display/JIRADEV/JIRA+REST+API+Example+-+Basic+Authentication , si usted lo está haciendo en C# tiene que enviar los datos codificados en la cabecera de la siguiente forma:

Autorización ": Básico [CODIFICADO CREDENCIALES]"

Aquí está un ejemplo sencillo:

public enum JiraResource 
{ 
    project 
} 

protected string RunQuery(
    JiraResource resource, 
    string argument = null, 
    string data = null, 
    string method = "GET") 
{ 
    string url = string.Format("{0}{1}/", m_BaseUrl, resource.ToString()); 

    if (argument != null) 
    { 
     url = string.Format("{0}{1}/", url, argument); 
    } 

    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
    request.ContentType = "application/json"; 
    request.Method = method; 

    if (data != null) 
    { 
     using (StreamWriter writer = new StreamWriter(request.GetRequestStream())) 
     { 
      writer.Write(data); 
     } 
    } 

    string base64Credentials = GetEncodedCredentials(); 
    request.Headers.Add("Authorization", "Basic " + base64Credentials); 

    HttpWebResponse response = request.GetResponse() as HttpWebResponse; 

    string result = string.Empty; 
    using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
    { 
     result = reader.ReadToEnd(); 
    } 

    return result; 
} 

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

(JiraResource es sólo una enumeración que utilizo para decidir qué parte de la API de usar)

¡Espero que esto ayude!

+2

Esto debe ser aceptado como una respuesta. Lo probé y funciona. – EvAlex

+0

muchas gracias hombre, esto me ayudó mucho. – jfplataroti

+0

Esta solución no funcionará si está intentando conectarse utilizando el servicio WCF. – AskMe

2

Aquí es una solución más simple que funciona según sea necesario:

var mergedCredentials = string.Format("{0}:{1}", username, password); 
var byteCredentials = Encoding.UTF8.GetBytes(mergedCredentials); 
var encodedCredentials = Convert.ToBase64String(byteCredentials); 

using (WebClient webClient = new WebClient()) 
{ 
    webClient.Headers.Set("Authorization", "Basic " + encodedCredentials); 

    return webClient.DownloadString(url); 
} 
1

Si no desea codificar sus credenciales en cada petición que aquí es cómo hacer que el uso de cookies.

Al solicitar la cookie, no es necesario agregar ninguna autorización en los encabezados. Este método aceptará una cadena JSON con el nombre de usuario, la contraseña y la URL. Devolverá los valores de las cookies.

public async Task<JiraCookie> GetCookieAsync(string myJsonUserNamePassword, string JiraCookieEndpointUrl) 
{ 
    using (var client = new HttpClient()) 
     { 
      var response = await client.PostAsync(
       JiraCookieEndpointUrl, 
       new StringContent(myJsonUserNamePassword, Encoding.UTF8, "application/json")); 
      var json = response.Content.ReadAsStringAsync().Result; 
       var jiraCookie= JsonConvert.DeserializeObject<JiraCookie>(json); 
       return jArr; 
     } 
} 

public class JiraCookie 
{ 
    public Session session { get; set; } 
} 

public class Session 
{ 
    public string name { get; set; } 
    public string value { get; set; } 
} 

Cuando lo llamo usando url: http://[baseJiraUrl]/rest/auth/1/session se devuelve la siguiente respuesta JSON:

{ 
"session" : -{ 
"name" : JSESSIONID, 
"value" : cookieValue 
} 

Tenga en cuenta la URL anterior es válida en la versión de JIRA que estoy usando y puede variar dependiendo en qué versión estás usando Lea la documentación de la API de JIRA para obtener la URL correcta para la versión que está usando. Estoy usando lo siguiente: https://docs.atlassian.com/software/jira/docs/api/REST/7.6.1/#auth/1/session

Recuerde que tendrá que guardar su cookie y usarla en cada solicitud posterior. Consulte esta respuesta sobre cómo agregar cookies a su solicitud de HttpClient: How do I set a cookie on HttpClient's HttpRequestMessage.

Una vez que haya terminado con la cookie (cierre de sesión) simplemente envíe una solicitud de eliminación http con la misma URL que la publicación.

Cuestiones relacionadas