【问题标题】:ASP.NET MVC - Using cURL or similar to perform requests in applicationASP.NET MVC - 使用 cURL 或类似方法在应用程序中执行请求
【发布时间】:2015-05-07 19:19:47
【问题描述】:

我正在用 ASP.NET MVC(使用 C#)构建一个应用程序,我想知道如何在我的控制器中执行 curl http://www.mywebsite.com/clients_list.xml 之类的调用 基本上我想构建一种 REST API 来执行诸如显示编辑和删除之类的操作,例如 Twitter API。

但不幸的是,直到现在我在这个网站上除了 Windows 的 cURL 之外什么都没有找到:http://curl.haxx.se/

所以我不知道是否有任何传统的方法可以从 URL 中检索这种调用,方法是 post delete 和 put on requests 等...

我只是想知道一种简单的方法来在我的 ASP.NET MVC 应用程序的控制器中执行 curl 等命令。


更新:

嗨,我设法发出了 GET 请求,但现在我在检索 POST 请求时遇到了一个严重的问题,例如,我正在使用 Twitter 的更新状态 API,在 curl 中会像这样工作:

curl -u user:password -d "status=playing with cURL and the Twitter API" http://twitter.com/statuses/update.xml

但在我的 ASP.NET MVC 应用程序中,我在自定义函数中这样做:

string responseText = String.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://twitter.com/statuses/update.xml");
request.Method = "POST";
request.Credentials = new NetworkCredential("username", "password");
request.Headers.Add("status", "Tweeting from ASP.NET MVC C#");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
    responseText = sr.ReadToEnd();
}
return responseText;

现在的问题是这个请求返回 403 Forbidden, 我真的不知道为什么它在 curl 上完美运行

:\


更新:

我终于设法让它工作了,但可能有一种方法可以使它更清洁和美观,因为我是 C# 的新手,我需要更多的知识才能做到这一点,传递 POST 参数的方式让我非常很困惑,因为只是传递参数的代码很多。

好吧,我已经创建了一个 Gist - http://gist.github.com/215900 ,所以每个人都可以随意修改它。感谢您的帮助 çağdaş

也可以按照这里的代码:

public string TwitterCurl()
{
    //PREVENT RESPONSE 417 - EXPECTATION FAILED
    System.Net.ServicePointManager.Expect100Continue = false;

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://twitter.com/statuses/update.xml");
    request.Method = "POST";
    request.Credentials = new NetworkCredential("twitterUsername", "twitterPassword");

    //DECLARE POST PARAMS
    string headerVars = String.Format("status={0}", "Tweeting from ASP.NET MVC C#");
    request.ContentLength = headerVars.Length;

    //SEND INFORMATION
    using (StreamWriter streamWriter = new StreamWriter(request.GetRequestStream(), ASCIIEncoding.ASCII))
    {
        streamWriter.Write(headerVars);
        streamWriter.Close();
    }

    //RETRIEVE RESPONSE
    string responseText = String.Empty;
    using (StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream()))
    {
        responseText = sr.ReadToEnd();
    }

    return responseText;

    /*
    //I'M NOT SURE WHAT THIS IS FOR            
        request.Timeout = 500000;
        request.ContentType = "application/x-www-form-urlencoded";
        request.UserAgent = "Custom Twitter Agent";
        #if USE_PROXY
            request.Proxy = new WebProxy("http://localhost:3000", false);
        #endif
    */
}

【问题讨论】:

  • 这些用户名和密码参数应该是网络凭据还是简单的发布数据?我不知道 twitter API,所以如果你解释一下你到底想做什么会更好。
  • 顺便说一句,如果您达到了,您似乎可以获得 403 禁止状态; 1. 每天限制 1,000 次总更新。 2.每天限制250条直接消息。 3. 每小时限制 150 个 API 请求。 help.twitter.com/forums/10711/entries/15364
  • 对不起,在这种情况下,它试图从twitter.com/statuses/update.xml 连接到我的推特帐户,所以如果你尝试从浏览器访问它,你会看到它要求输入用户名和密码,所以在这种情况下,凭据将是我的 twitter 帐户用户名和密码,我认为这与 curl -u username:password 相同......所以在这种方法中,应用程序将连接到我的 twitter 帐户发布一条新的推文发送参数“status”+ 凭据,并检索 twitter 在这种情况下将发回 xml 文件的响应。
  • 谢谢,幸运的是这个 twitter 的速率限制还没有达到,我现在仍然可以通过 curl 做到这一点,但不能用 c#
  • 我找不到有关如何编写该状态参数的信息。因为如果那应该在帖子数据中,那么您的示例是错误的。我仍然会编辑我的答案并提供一个发布数据的示例。

标签: asp.net-mvc api rest curl twitter


【解决方案1】:

尝试使用 Microsoft.Http.HttpClient。这就是您的请求的样子

var client = new HttpClient();
client.DefaultHeaders.Authorization = Credential.CreateBasic("username","password");

var form = new HttpUrlEncodedForm();
form.Add("status","Test tweet using Microsoft.Http.HttpClient");
var content = form.CreateHttpContent();

var resp = client.Post("http://www.twitter.com/statuses/update.xml", content);
string result = resp.Content.ReadAsString();

您可以在WCF REST Starter kit Preview 2 中找到这个库及其源代码,但是它可以独立于其中的其他内容使用。

附:我在我的 twitter 帐户上测试了这段代码,它可以工作。

【讨论】:

  • 嗨,Darrel,谢谢它看起来很简单,但不幸的是,我找不到类 HttpClient 和 HttpUrlEncodedForm,我已经安装了这个 WCF 库但我找不到它,即使在 Microsoft 库中,实际上这里没有 Microsoft.Http 命名空间,我确定我做错了什么。对不起
  • 在我的机器上,dll 位于 C:\Program Files (x86)\Microsoft WCF REST\WCF REST Starter Kit Preview 2\Assemblies。此外,安装程序中还包含一个包含源代码的 zip 文件。打开它,完整的源代码就在那里。
【解决方案2】:

使用HttpWebRequestHttpWebResponse 的示例代码:

public string GetResponseText(string url) {
    string responseText = String.Empty;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "GET";
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    using (StreamReader sr = new StreamReader(response.GetResponseStream())) {
        responseText = sr.ReadToEnd();
    }
    return responseText;
}

发布数据:

public string GetResponseText(string url, string postData) {
    string responseText = String.Empty;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentLength = postData.Length;
    using (StreamWriter sw = new StreamWriter(request.GetRequestStream())) {
        sw.Write(postData);
    }
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    using (StreamReader sr = new StreamReader(response.GetResponseStream())) {
        responseText = sr.ReadToEnd();
    }
    return responseText;
}

【讨论】:

  • 非常感谢那个çağdaş,现在我遇到了另一个问题,我已经编辑了这个问题,所以如果你愿意,你可以在那里签到。再次感谢
【解决方案3】:

这是我用于调用返回 JSON 的 RESTful API 的单行代码。

return ((dynamic) JsonConvert.DeserializeObject<ExpandoObject>(
        new WebClient().DownloadString(
            GetUri(surveyId))
    )).data;

备注

  • Uri 是使用surveyId 和凭据在后台生成的
  • “数据”属性是返回的反序列化 JSON 对象的一部分 通过 SurveyGizmo API

完整的服务

public static class SurveyGizmoService
{
    public static string UserName { get { return WebConfigurationManager.AppSettings["SurveyGizmo.UserName"]; } }
    public static string Password { get { return WebConfigurationManager.AppSettings["SurveyGizmo.Password"]; } }
    public static string ApiUri { get { return WebConfigurationManager.AppSettings["SurveyGizmo.ApiUri"]; } }
    public static string SurveyId { get { return WebConfigurationManager.AppSettings["SurveyGizmo.Survey"]; } }

    public static dynamic GetSurvey(string surveyId = null)
    {
        return ((dynamic) JsonConvert.DeserializeObject<ExpandoObject>(
                new WebClient().DownloadString(
                    GetUri(surveyId))
            )).data;
    }

    private static Uri GetUri(string surveyId = null)
    {
        if (surveyId == null) surveyId = SurveyId;
        return new UriBuilder(ApiUri)
                {
                        Path = "/head/survey/" + surveyId,
                        Query = String.Format("user:pass={0}:{1}", UserName, Password)
                }.Uri;
    }
}

【讨论】:

    【解决方案4】:

    查看 System.Net.WebClient 类。它应该提供您需要的功能。对于更精细的控制,您可能会发现 WebRequest 更有用,但 WebClient 似乎最适合您的需求。

    【讨论】:

      猜你喜欢
      • 2018-09-02
      • 2016-06-28
      • 2016-08-12
      • 2012-06-22
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      相关资源
      最近更新 更多