2017-01-12 3 views
0

Quelqu'un m'aide à obtenir le JSON du site gitlab. J'ai écrit mon code mais quand je compile le code je reçois l'exception The remote server returned an error: (401) Unauthorized. dans mon application de console (C#).C# comment obtenir la chaîne JSON en utilisant HttpWebRequest

Dans mon navigateur, je cours la même URL quand j'ai signé dans le navigateur, je peux obtenir la chaîne JSON. Si je cours la même URL après la déconnexion du navigateur, j'obtiens le message {"message":"401 Unauthorized"} dans mon navigateur.

En raison de cette même exception, je pense que je n'ai pas passé le nom d'utilisateur et les informations d'identification dans mon HttpWebRequest.

je faire l'exception dans la ligne HttpWebResponse response = request.GetResponse() as HttpWebResponse;

Mon code:

  string URL = "http://gitlab.company.com/api/v3/users?per_page=100&page=1"; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 
      request.ContentType = "application/json; charset=utf-8"; 
      request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("userName:passWord")); 
      request.PreAuthenticate = true; 
      HttpWebResponse response = request.GetResponse() as HttpWebResponse; 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); 
       Console.WriteLine(reader.ReadToEnd()); 
      } 

Ma question:

  1. quoi et où ai-je fait une erreur?
  2. Je sais que je dois utiliser le verbe GET pour obtenir les données dans l'API, mais je ne sais pas où je dois utiliser le verbe GET?

Merci d'avance.

+1

Je pense que lorsque vous utilisez "request.Headers", il n'est pas nécessaire de définir "request.PreAuthenticate = true;". Au moins, comment cela fonctionne dans mon code (pas pour gitlab mais un autre serveur). (Mais j'utilise "request.Headers.Add"). Et vous code devrait contenir "request.Method =" GET ";" – Julo

+0

Commencez par lire le message d'erreur: non autorisé. Cela signifie que vous avez utilisé les fausses informations d'identification. Pourquoi n'utilisez-vous pas la propriété 'Credentials' comme indiqué ici [Comment utiliser la propriété HttpWebRequest.Credentials pour l'authentification de base?] (Http://stackoverflow.com/questions/19764113/how-to-use-httpwebrequest-credentials- property-for-basic-authentication) –

+0

Aussi, pourquoi utilisez-vous HttpWebRequest au lieu de HttpClient par exemple? Toutes ces lignes pourraient être réduites à 3-4 –

Répondre

2

Utiliser le codage dans votre demande, les informations d'identification doivent être codées dans la norme ISO-8859-1

 string URL = "http://gitlab.company.com/api/v3/users?per_page=100&page=1"; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 
     request.ContentType = "application/json; charset=utf-8"; 
     request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes("username:password")); 
     request.PreAuthenticate = true; 
     HttpWebResponse response = request.GetResponse() as HttpWebResponse; 
     using (Stream responseStream = response.GetResponseStream()) 
     { 
      StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); 
      Console.WriteLine(reader.ReadToEnd()); 
     } 

Si cela ne fonctionne pas, supprimez la ligne en-têtes et le remplacer par ce qui suit:

request.Credentials = new NetworkCredential("username", "password"); 
+0

J'ai essayé les deux changements dans mon code. mais je fais face à la même exception pour les deux changements (401 non autorisé) –

+1

Je vous suggère d'entrer en contact avec syncfusion et de leur demander quel type d'authentification est nécessaire pour accéder à la page. Il semble qu'ils n'utilisent pas les méthodes d'authentification de base. –