2017-02-22 1 views
1

J'ai un WebRequest en C# que j'essaie d'utiliser pour récupérer des données d'Instagram. WebRequest lance The remote server returned an error: (403) Forbidden., mais une commande cURL renvoie HTML. En pratique, mes données de formulaire POST seront plus longues et retourneront JSON.C# WebRequest mais pas cURL Donne Erreur 403

C#

 String uri = "https://www.instagram.com/query/"; 
     var request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Method = "POST"; 

     string postData = "q=ig_user(1118028333)"; 
     ASCIIEncoding encoding = new ASCIIEncoding(); 
     byte[] byte1 = encoding.GetBytes(postData); 

     // Set the content type of the data being posted. 
     request.ContentType = "application/x-www-form-urlencoded"; 

     // Set the content length of the string being posted. 
     request.ContentLength = byte1.Length; 


     using (var dataStream = request.GetRequestStream()) 
     { 
      dataStream.Write(byte1, 0, byte1.Length); 
     } 

     try 
     { 
      var x = (HttpWebResponse)request.GetResponse(); 
     } 
     catch (WebException wex) 
     { 
      String wMessage = wex.Message; 
     } 

Lancers erreur 403.

cURL (sous Windows)

curl "https://www.instagram.com/query/" --data "q=ig_user(1118028333)" 

retours HTML.

FireFox Demande du corps, méthode = POST, sans en-tête

q=ig_user(1118028333) 

retours HTML

Pourquoi l'erreur de lancer WebRequest 403, mais pas cURL ou FireFox? Que puis-je faire en C# pour obtenir des données?

Répondre

1

Pourquoi WebRequest renvoie-t-il l'erreur 403, mais pas cURL ou FireFox?

Je pense que vous êtes confus. La raison pour laquelle je suppose, c'est parce que j'ai juste essayé de faire la même chose avec Postman et pendant que j'obtiens une réponse HTML, j'obtiens aussi le code d'état de réponse 403. Je pense que vous ne faites peut-être pas attention au code de réponse de cUrl. Voir ci-dessous

enter image description here

Que puis-je faire d'autre en C# pour obtenir des données?

Normalement, je tente d'utiliser la System.Net.Http.HttpClient classe, donc je peux vérifier le code d'état avant de l'exception est levée et je peux même récupérer le contenu de la réponse (le cas échéant), même si le code de réponse est supérieure à 400 (réponse d'erreur)

try 
{ 
    var client = new HttpClient(); 
    var response = await client.GetAsync(url); 

    if (response.IsSuccessStatusCode) 
    { 
     var json = await response.Content.ReadAsStringAsync(); 
    } 
    else 
    { 
     string content = null; 

     if (response.Content != null) 
     { 
      content = await response.Content.ReadAsStringAsync(); 
     } 
    } 

} 
catch (Exception ex){}