WebRequest是与网站交互的正确C#工具吗?

时间:2020-03-06 14:20:37  来源:igfitidea点击:

我正在用C编写一个小工具,它将需要使用POST和json格式向/从网站发送和接收数据。我以前从来没有用C(或者实际上是任何一种语言)做过这样的事情,所以我一直在努力寻找一些有用的信息来使我入门。

我已经在C中的WebRequest类上找到了一些信息(特别是从这里开始),但是在我开始研究它之前,我想知道这是否是适合该工作的工具。

我发现有很多工具可以将数据转换为json格式,但没有太多其他功能,因此,如果我最终陷入困境,那么这里的任何信息都将非常有用。

解决方案

我已经使用WebRequest与网站进行交互。这是正确的"工具"

我无法评论我们问题的JSON方面。

在3.5中有一个内置的jsonserializer。 webrequest是我们所需要的合适课程。

几个例子:

  • http://geekswithblogs.net/JuanDoNeblo/archive/2007/10/24/json_in_aspnetajax_part2.aspx
  • http://dev.aol.com/blog/markdeveloper/ShareFileWithNETFramework
  • http://geekswithblogs.net/JuanDoNeblo/archive/2007/10.aspx

WebClient有时比WebRequest更易于使用。我们可能想看看它。

对于JSON反序列化,我们将需要查看JavaScriptSerializer类。

WebClient示例:

using (WebClient client = new WebClient ())
{
    //manipulate request headers (optional)
    client.Headers.Add (HttpRequestHeader.UserAgent, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");

    //execute request and read response as string to console
    using (StreamReader reader = new StreamReader(client.OpenRead(targetUri)))
    {
        string s = reader.ReadToEnd ();
        Console.WriteLine (s);
    }
}

如果有人要更新代码,则标记为Wiki

当涉及到将数据发布到网站时,System.Net.HttpWebRequest(WebRequest的HTTP特定实现)是一个非常不错的解决方案。它支持SSL,异步请求和许多其他功能,并且在MSDN上有详细记录。

有效负载可以是任何内容:JSON格式的数据或者任何其他东西-只要将ContentType属性设置为服务器期望和理解的内容(最有可能的application / json,text / json或者text / x-json),就可以了。

使用来自系统服务的HttpWebRequest时的一个潜在问题:由于它使用IE代理和凭据信息,因此以LOCALSYSTEM用户(或者基本上没有定期交互登录的任何帐户)运行时,默认行为可能会有些奇怪)。将Proxy和Authentication属性设置为Nothing(或者,正如我们Cfolks宁愿称其为null,我猜)应该避免这种情况。

WebRequest(尤其是HttpWebRequest类)是我们要实现的目标的良好起点。要创建请求,我们将使用WebRequest.Create并将创建的请求投射到HttpWebRequest上以实际使用它。然后,我们将创建自己的帖子数据,并将其发送到流中,如下所示:

HttpWebRequest req = (HttpWebRequest)
WebRequest.Create("http://mysite.com/index.php");
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
string postData = "var=value1&var2=value2";
req.ContentLength = postData.Length;

StreamWriter stOut = new
StreamWriter(req.GetRequestStream(),
System.Text.Encoding.ASCII);
stOut.Write(postData);
stOut.Close();

同样,我们可以使用GetResponse方法读回响应,该方法将允许我们读取生成的响应流并执行其他需要做的事情。我们可以在以下位置找到有关该课程的更多信息:

http://msdn.microsoft.com/zh-CN/library/system.net.httpwebrequest.aspx

要将实例对象转换为json格式的字符串,反之亦然,请尝试Json.NET:
http://json.codeplex.com/

我目前在项目中使用它,它易于学习和使用,并在序列化和自定义类型转换器方面提供了一定的灵活性。它还支持用于查询json输入的LINQ语法。