Comment puis-je utiliser demande-réponse à l'aide des bibliothèques HTTP en C # .NET / Mono

StackOverflow https://stackoverflow.com/questions/2397431

Question

En ce moment je suis en train d'utiliser Launchpad's API d'écrire un petit emballage dessus en utilisant C # .NET ou Mono. Selon OAuth, je dois d'abord pour obtenir les demandes signées et Launchpad a sa propre façon de le faire .

Ce que je dois faire est de créer une connexion à https://edge.launchpad.net / + demande-jeton avec des en-têtes HTTP nécessaires comme Content-type. En python je urllib2, mais comme je jetai un regard dans l'espace de noms System.Net, il fait sauter ma tête. Je ne pouvais pas comprendre comment commencer avec elle. Il y a beaucoup de confusion si je peux utiliser WebRequest, HttpWebRequest ou WebClient. Avec WebClient je reçois même des erreurs de certificats depuis, ils ne sont pas ajoutés comme ceux de confiance.

A partir de la documentation de l'API, il est dit que doivent envoyer trois clés via POST

  • auth_consumer_key: clé client
  • oauth_signature_method: La chaîne "PLAINTEXT"
  • oauth_signature: La chaîne "&".

Ainsi, la requête HTTP pourrait ressembler à ceci:

POST /+request-token HTTP/1.1
Host: edge.launchpad.net
Content-type: application/x-www-form-urlencoded

oauth_consumer_key=just+testing&oauth_signature_method=PLAINTEXT&oauth_signature=%26

La réponse devrait ressembler à ceci:

200 OK

oauth_token=9kDgVhXlcVn52HGgCWxq&oauth_token_secret=jMth55Zn3pbkPGNht450XHNcHVGTJm9Cqf5ww5HlfxfhEEPKFflMqCXHNVWnj2sWgdPjqDJNRDFlt92f

J'ai changé mon code plusieurs fois et enfin tout ce que je peux obtenir quelque chose comme

HttpWebRequest clnt = HttpWebRequest.Create(baseAddress) as HttpWebRequest;
// Set the content type
clnt.ContentType =  "application/x-www-form-urlencoded";
clnt.Method = "POST";

string[] listOfData ={
    "oauth_consumer_key="+oauth_consumer_key, 
    "oauth_signature="+oauth_signature, 
    "oauth_signature_method"+oauth_signature_method
};

string postData = string.Join("&",listOfData);
byte[] dataBytes= Encoding.ASCII.GetBytes(postData);

Stream newStream = clnt.GetRequestStream();
newStream.Write(dataBytes,0,dataBytes.Length);

Comment procèdes-je encore? Dois-je faire un appel sur Lire clnt?

Pourquoi ne peut pas devs .NET faire une classe que nous pouvons utiliser pour lire et écrire au lieu de créer des centaines de classes et confondant tous les nouveaux arrivants.

Était-ce utile?

La solution

Non, vous devez fermer le flux de demande avant d'obtenir le flux de réponse.
Quelque chose comme ceci:

Stream s= null;
try
{
    s = clnt.GetRequestStream();
    s.Write(dataBytes, 0, dataBytes.Length);
    s.Close();

    // get the response
    try
    {
        HttpWebResponse resp = (HttpWebResponse) req.GetResponse();
        if (resp == null) return null;

        // expected response is a 200 
        if ((int)(resp.StatusCode) != 200)
            throw new Exception(String.Format("unexpected status code ({0})", resp.StatusCode));
        for(int i=0; i < resp.Headers.Count; ++i)  
                ;  //whatever

        var MyStreamReader = new System.IO.StreamReader(resp.GetResponseStream());
        string fullResponse = MyStreamReader.ReadToEnd().Trim();
    }
    catch (Exception ex1)
    {
        // handle 404, 503, etc...here
    }
}    
catch 
{
}

Mais si vous n'avez pas besoin tout le contrôle, vous pouvez faire une demande de WebClient plus simplement.

string address = "https://edge.launchpad.net/+request-token";
string data = "oauth_consumer_key=just+testing&oauth_signature_method=....";
string reply = null;
using (WebClient client = new WebClient ())
{
  client.Headers.Add("Content-Type","application/x-www-form-urlencoded");
  reply = client.UploadString (address, data);
}

Code de travail complet (compiler en v3.5 .NET):

using System;
using System.Net;
using System.Collections.Generic;
using System.Reflection;

// to allow fast ngen
[assembly: AssemblyTitle("launchpad.cs")]
[assembly: AssemblyDescription("insert purpose here")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Dino Chiesa")]
[assembly: AssemblyProduct("Tools")]
[assembly: AssemblyCopyright("Copyright © Dino Chiesa 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.1.1.1")]

namespace Cheeso.ToolsAndTests
{
    public class launchpad
    {
        public void Run()
        {
            // see http://tinyurl.com/yfkhwkq
            string address = "https://edge.launchpad.net/+request-token";

            string oauth_consumer_key = "stackoverflow1";
            string oauth_signature_method = "PLAINTEXT";
            string oauth_signature = "%26";

            string[] listOfData ={
                "oauth_consumer_key="+oauth_consumer_key,
                "oauth_signature_method="+oauth_signature_method,
                "oauth_signature="+oauth_signature
            };

            string data = String.Join("&",listOfData);

            string reply = null;
            using (WebClient client = new WebClient ())
            {
                client.Headers.Add("Content-Type","application/x-www-form-urlencoded");
                reply = client.UploadString (address, data);
            }

            System.Console.WriteLine("response: {0}", reply);
        }

        public static void Usage()
        {
            Console.WriteLine("\nlaunchpad: request token from launchpad.net\n");
            Console.WriteLine("Usage:\n  launchpad");
        }


        public static void Main(string[] args)
        {
            try
            {
                new launchpad()
                    .Run();
            }
            catch (System.Exception exc1)
            {
                Console.WriteLine("Exception: {0}", exc1.ToString());
                Usage();
            }
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top