Wie verwende ich Anfrage-Antwort über HTTP-Bibliotheken in C # .NET / Mono
-
25-09-2019 - |
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.
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();
}
}
}
}