【问题标题】:Translate a piece of PHP cURL code to C#将一段 PHP cURL 代码翻译成 C#
【发布时间】:2014-08-11 09:24:35
【问题描述】:

我正在尝试翻译这段为从基础网站(活动跟踪器)获取数据而编写的代码。我在这里要实现的任务是获取 Http 响应头中返回的 access_token。原始 PHP 代码没有问题,但是,有一些 cUrl 选项我不知道如何映射到 C# 的 WebClient 实现。这些选项包括 CURLOPT_RETURNTRANSFER、CURLOPT_FOLLOWLOCATION 和 CURLOPT_COOKIESESSION。

具体问题如下,这里是一段PhP代码:

    $login_data = array(
        'username' => $this->username,
        'password' => $this->password,
    );

    // Initialize the cURL resource and make login request
    $ch = curl_init();
    curl_setopt_array($ch, array(
        CURLOPT_URL => 'https://app.mybasis.com/login',
        CURLOPT_RETURNTRANSFER => false, //default: true
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $login_data,
        CURLOPT_FOLLOWLOCATION => true, // defulat: true
        CURLOPT_HEADER => 1,
        CURLOPT_COOKIESESSION => true,
        CURLOPT_COOKIEJAR => $this->cookie_jar
    ));

使用此代码,结果将是:(其中包含我需要的访问令牌)

HTTP/1.1 100 Continue

HTTP/1.1 302 Found
Date: Sun, 22 Jun 2014 02:03:47 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Connection: keep-alive
Server: TornadoServer/3.2
Location: https://app.mybasis.com
Cache-Control: max-age=0
Set-Cookie: access_token=f0659120d52f3fde9edfw1d908b81f0f; Domain=.    mybasis.com; expires=Sun, 01 Jan 2040 00:00:00 GMT; Path=/
Set-Cookie: scope=login; Domain=.mybasis.com; expires=Sun, 01 Jan     2040 00:00:00 GMT; Path=/
Set-Cookie: refresh_token=982ff518bfe114e2c03f360f0dfbfke1; Domain=.    mybasis.com; expires=Sun, 01 Jan 2040 00:00:00 GMT; Path=/

HTTP/1.1 200 OK
Server: nginx/1.4.3
Date: Sun, 22 Jun 2014 02:03:47 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 5619
Last-Modified: Fri, 25 Apr 2014 04:42:49 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "5359e7c9-15f3"
Accept-Ranges: bytes

但是,当我使用 C# WebClient 与基础通信时,如下所示:

 var data = new NameValueCollection
 {
     { "username", username},
     { "password", password},
 };

 HttpWebResponse response = client.UploadValues("https://app.mybasis.com/login", "POST", data);

 foreach (string name in client.ResponseHeaders.Keys)
 {
     Console.WriteLine(name+"="+client.ResponseHeaders[name]);
 }

我只能得到这个:

Connection=keep-alive
Vary=Accept-Encoding
Accept-Ranges=bytes
Content-Length=5619
Content-Type=text/html; charset=utf-8
Date=Sun, 22 Jun 2014 02:17:44 GMT
ETag="53f3e7c9-99f3"
Last-Modified=Fri, 25 Apr 2014 04:42:49 GMT
Server=nginx/1.4.3

作为回应。

有谁知道为什么我不能得到前两个 Http 响应而只能得到第三个?

【问题讨论】:

标签: c# php curl


【解决方案1】:

为了从 C# 中获得您正在寻找的功能,您需要使用 .NET 框架中的 Http Web Request API。它应该提供您正在寻找的功能。

【讨论】:

  • 是的,我确实使用了 HttpWebRequest API,但是,我的问题是我找不到将 CURLOPT_RETURNTRANSFER、CURLOPT_FOLLOWLOCATION 和 CURLOPT_COOKIESESSION 转换为 .NET 的选项。
  • C# 不是 PHP,因此请尝试以不同的方式思考它。我相信 MS 提供的 HttpWebRequest 库已经无需您询问即可返回数据,以及以下位置标头等。至于cookie session你可以参考这篇文章:stackoverflow.com/questions/4158448/…
【解决方案2】:

我做了同样的事情,但使用了 4.5 HttpClient

        CookieContainer cookies = new CookieContainer();
        HttpClientHandler handler = new HttpClientHandler();
        handler.CookieContainer = cookies;

        HttpClient client = new HttpClient(handler);


        // Create the HttpContent for the form to be posted.
        var requestContent = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("username", "***"),
            new KeyValuePair<string, string>("password", "***"),
        });

        // Get the response.
        HttpResponseMessage response = await client.PostAsync(
            "https://app.mybasis.com/login",
            requestContent);

        // Get the response content.
        HttpContent responseContent = response.Content;


        Uri uri = new Uri("https://app.mybasis.com/login");
        IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>();
        foreach (Cookie cookie in responseCookies)
            Console.WriteLine(cookie.Name + ": " + cookie.Value);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多