【问题标题】:How do I use request-response using HTTP libraries in C#.NET/Mono如何在 C#.NET/Mono 中使用 HTTP 库来使用请求-响应
【发布时间】:2010-03-07 18:42:54
【问题描述】:

现在我一直在尝试使用 Launchpad's API 使用 C#.NET 或 Mono 编写一个小的包装器。 根据OAuth,我首先需要签署请求和Launchpad has it's own way of doing so

我需要做的是使用一些必要的 HTTP 标头(例如 Content-type)创建到 https://edge.launchpad.net/+request-token 的连接。在 python 中,我有 urllib2,但是当我浏览 System.Net 命名空间时,它让我大吃一惊。我无法理解如何开始。我是否可以使用WebRequestHttpWebRequestWebClient,有很多困惑。使用 WebClient 我什至会收到证书错误,因为它们没有被添加为受信任的。

来自 API Docs,它说三个密钥需要通过 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 开发人员不能创建一个我们可以用来读写的类,而不是创建数百个类并让每个新手都感到困惑。

【问题讨论】:

    标签: c# .net http networking launchpad


    【解决方案1】:

    不,您需要在获取响应流之前关闭请求流。
    像这样的:

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

    但是如果你不需要所有的控制,你可以更简单地做一个 WebClient 请求。

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

    【讨论】:

    • 我在这段代码pastebin.ca/1827416 中尝试了这个并且得到了错误pastebin.ca/1827421
    • 我刚刚尝试了完整的代码。我把它贴在上面。它对我有用。
    • 谢谢芝士。回家后试试看。
    猜你喜欢
    • 2014-07-24
    • 2021-08-03
    • 2020-05-13
    • 2015-03-24
    • 2020-04-12
    • 2020-02-10
    • 2012-08-01
    • 2012-12-18
    相关资源
    最近更新 更多