كيف يمكنني استخدام الاستجابة للطلب باستخدام مكتبات HTTP في C#.NET/MONO

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

سؤال

الآن كنت أحاول استخدام Launchpad's API لكتابة غلاف صغير فوقه باستخدام C#.NET أو Mono. حسب OAuth, ، أحتاج أولاً إلى توقيع الطلبات و تتمتع Launchpad بطريقتها الخاصة للقيام بذلك.

ما يجب علي فعله هو إنشاء اتصال https://edge.launchpad.net/+request-token مع بعض رؤوس HTTP الضرورية مثل Content-type. في Python لدي urllib2 ، ولكن كما ألقيت نظرة على مساحة اسم System.net ، فجر رأسي. لم أتمكن من فهم كيفية البدء به. هناك الكثير من الالتباس سواء كان بإمكاني استخدامه WebRequest, HttpWebRequest أو WebClient. مع WebClient ، أحصل على أخطاء في الشهادة منذ ذلك الحين ، لا يتم إضافتها كأخطاء موثوقة.

من مستندات API ، تقول أن ثلاثة مفاتيح تحتاج إلى إرسالها عبر POST

  • Auth_consumer_key: مفتاح المستهلك الخاص بك
  • Oauth_signature_method: السلسلة "plaintext"
  • Oauth_signature: السلسلة "&".

لذلك قد يبدو طلب HTTP هكذا:

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

يجب أن تبدو الاستجابة شيئًا كهذا:

200 OK

oauth_token=9kDgVhXlcVn52HGgCWxq&oauth_token_secret=jMth55Zn3pbkPGNht450XHNcHVGTJm9Cqf5ww5HlfxfhEEPKFflMqCXHNVWnj2sWgdPjqDJNRDFlt92f

لقد غيرت رمزتي عدة مرات وأخيراً كل ما يمكنني الحصول عليه مثل

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

كيف يمكنني المضي قدما؟ هل يجب علي إجراء مكالمة قراءة clnt ?

لماذا لا تستطيع .NET Devs صنع فئة واحدة يمكننا استخدامها للقراءة والكتابة بدلاً من إنشاء مئات الفصول الدراسية وإرباك كل وافد جديد.

هل كانت مفيدة؟

المحلول

لا ، تحتاج إلى إغلاق دفق الطلب قبل الحصول على دفق الاستجابة.
شيء من هذا القبيل:

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

ولكن إذا لم تكن بحاجة إلى كل عنصر التحكم ، فيمكنك القيام بطلب ويب أكثر بكل بساطة.

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

رمز العمل الكامل (ترجمة في .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();
            }
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top