【问题标题】:Sending HTTP POST with System.Net.WebClient使用 System.Net.WebClient 发送 HTTP POST
【发布时间】:2012-01-03 13:24:37
【问题描述】:

是否可以使用 System.Net.WebClient 发送带有一些表单数据的 HTTP POST?

如果没有,是否有像 WebClient 这样可以进行 HTTP POST 的库?我知道我可以使用 System.Net.HttpWebRequest,但我正在寻找不那么冗长的东西。

希望它看起来像这样:

Using client As New TheHTTPLib
    client.FormData("parm1") = "somevalue"
    result = client.DownloadString(someurl, Method.POST)
End Using

【问题讨论】:

    标签: .net vb.net http webclient


    【解决方案1】:

    根据@carlosfigueira 的回答,我进一步研究了WebClient 的方法,发现UploadValues,这正是我想要的:

    Using client As New Net.WebClient
        Dim reqparm As New Specialized.NameValueCollection
        reqparm.Add("param1", "somevalue")
        reqparm.Add("param2", "othervalue")
        Dim responsebytes = client.UploadValues(someurl, "POST", reqparm)
        Dim responsebody = (New Text.UTF8Encoding).GetString(responsebytes)
    End Using
    

    关键部分是这样的:

    client.UploadValues(someurl, "POST", reqparm)
    

    它发送我输入的任何动词,它还帮助我创建正确的 url 编码表单数据,我只需提供参数作为 namevaluecollection。

    【讨论】:

    • someUrl 指的是什么?我正在尝试登录具有 HTML 登录表单的网站,但它没有登录。结果数据就像我是匿名的一样。
    • @Shimmy 我没有尝试在需要登录的网站上使用 webclient。 someUrl 是 URL 字符串,例如client.UploadValues("http://localhost", "POST", reqparm)
    • 我们可以将这个POST请求(包括参数调用)与异步调用一起使用吗?
    • 它工作正常,感谢您的回答!但是当我调用 Net.WebClient.UploadValues 方法时,它会启动 7 个线程并且不会停止这些线程。我该怎么办?
    【解决方案2】:

    WebClient 不直接支持表单数据,但您可以使用 UploadString 方法发送 HTTP 帖子:

    Using client as new WebClient
        result = client.UploadString(someurl, "param1=somevalue&param2=othervalue")
    End Using
    

    【讨论】:

    • POST - 这是UploadString 的默认值。您还可以将 HTTP 动词作为可选的第三个参数传递。
    • 我猜表单数据需要转义:"param1=" & HttpUtility.UrlEncode("somevalue")
    • 如果值需要转义,可以。 “somevalue”没有。正如我所提到的,WebClient 本身没有任何表单支持,您需要自己创建字符串。
    • 根据您的回答,我找到了 UploadValues。谢谢!
    • 有趣,我不知道。感谢分享:)
    【解决方案3】:

    就 http 动词而言,WebRequest 可能更简单。你可以选择类似的东西:

        WebRequest r = WebRequest.Create("http://some.url");
        r.Method = "POST";
        using (var s = r.GetResponse().GetResponseStream())
        {
            using (var reader = new StreamReader(r, FileMode.Open))
            {
                var content = reader.ReadToEnd();
            }
        }
    

    显然这缺少异常处理和编写请求正文(您可以使用r.GetRequestStream() 并像常规流一样编写它,但我希望它可能会有所帮助。

    【讨论】:

    • 问题有标签vb.net
    猜你喜欢
    • 1970-01-01
    • 2018-07-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2013-06-14
    相关资源
    最近更新 更多