Frage

Im Moment habe ich versucht, Launchpad's API zu verwenden, um einen kleinen Wrapper über sie zu schreiben, mit C # .NET oder Mono. Wie pro OAuth, ich muß zuerst die Anträge unterzeichnet und Launchpad hat seine eigene Art und Weise, dies zu tun .

Was muss ich tun, ist eine Verbindung zum https://edge.launchpad.net erstellen / + Anfrage-Token mit einigen notwendigen HTTP-Header wie Content-type. In Python habe ich urllib2, aber wie ich in System.Net-Namespace sah, blies es aus meinem Kopf. Ich war nicht in der Lage zu verstehen, wie man damit beginnen. Es gibt eine Menge Verwirrung, ob ich WebRequest, HttpWebRequest oder WebClient verwenden können. Mit WebClient ich sogar Zertifikat Fehler bekommen, da sie nicht als vertrauenswürdig sind hinzugekommen.

Von der API-Dokumentation heißt es, dass drei Tasten müssen abgeschickt über POST

  • auth_consumer_key: Ihr Consumer-Key
  • oauth_signature_method: Die Zeichenfolge "KLARTEXT"
  • oauth_signature: Die Zeichenfolge "&".

So ist die HTTP-Anforderung könnte wie folgt aussehen:

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

Die Antwort sollte wie folgt aussehen:

200 OK

oauth_token=9kDgVhXlcVn52HGgCWxq&oauth_token_secret=jMth55Zn3pbkPGNht450XHNcHVGTJm9Cqf5ww5HlfxfhEEPKFflMqCXHNVWnj2sWgdPjqDJNRDFlt92f

änderte ich mein Code viele Male und schließlich alles kann ich es bekommen etwas wie

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);

Wie gehe ich weiter? Soll ich einen Read Anruf auf clnt tun?

Warum kann .NET Entwickler machen eine Klasse, die wir Hunderte von Klassen lesen und zu schreiben, anstatt das Erstellen und verwirrend jeden Neuling verwenden können.

War es hilfreich?

Lösung

Nein, müssen Sie den Antrag Strom zu schließen, bevor die Antwort Strom bekommen.
So etwas wie folgt aus:

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 
{
}

Wenn Sie aber alle die Kontrolle nicht benötigen, können Sie eine WebClient Anfrage einfach mehr tun.

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);
}

Vollarbeitscode (Kompilierung in .NET v3.5):

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();
            }
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top