【问题标题】:POST variables to web server?POST 变量到网络服务器?
【发布时间】:2010-05-03 18:53:52
【问题描述】:

我一直在尝试从 Google 将数据发布到网络服务器的几件事,但它们都不起作用:考虑到第二个变量是 SQL 查询,我仍然坚持如何将变量转换为请求所以它有空格。

有人知道使用WebClient POST 数据的正确方法吗?我宁愿使用WebClient,因为它比HttpWebRequest/HttpWebResponse需要更少的代码。

到目前为止,这是我尝试过的:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim wc = New WebClient()

    ''#convert data
    wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded")
    Dim postData = String.Format("db={0}&query={1}", _
                                 HttpUtility.UrlEncode("books.sqlite"), _
                                 HttpUtility.UrlEncode("SELECT id,title FROM boooks"))

    ''#Dim bytArguments As Byte() = Encoding.ASCII.GetBytes("db=books.sqlite|query=SELECT * FROM books")

    ''#POST query
    Dim bytRetData As Byte() = wc.UploadData("http://localhost:9999/get", "POST", postData)
    RichTextBox1.Text = Encoding.ASCII.GetString(bytRetData)

    Exit Sub

    Dim client = New WebClient()

    Dim nv As New Collection
    nv.Add("db", "books.sqlite")
    nv.Add("query", "SELECT id,title FROM books")

    Dim address As New Uri("http://localhost:9999/get")

    ''#Dim bytRetData As Byte() = client.UploadValues(address, "POST", nv)

    RichTextBox1.Text = Encoding.ASCII.GetString(bytRetData)

    Exit Sub

    ''#Dim wc As New WebClient()

    ''#convert data
    wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded")
    Dim bytArguments As Byte() = Encoding.ASCII.GetBytes("db=books.sqlite|query=SELECT * FROM books")

    ''#POST query
    ''#Dim bytRetData As Byte() = wc.UploadData("http://localhost:9999/get", "POST", bytArguments)
    RichTextBox1.Text = Encoding.ASCII.GetString(bytRetData)

    Exit Sub
End Sub

谢谢。


编辑:感谢大家的反馈。

对于那些有同样问题的人,这里有一些工作代码:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim baseURL As String = "localhost:9999"
    Dim strURL As String = "http://" & baseURL & "/get"
    
    Dim client As New WebClient()
    
    client.Headers.Add("Content-Type", "application/x-www-form-urlencoded")
    client.Headers.Add("Accept-Encoding", "text/plain")
    client.Headers.Add("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Iron/4.0.280.0 Chrome/4.0.280.0 Safari/532.9")
    'BAD client.Headers.Add("Host", baseURL)
    'BAD client.Headers.Add("Host", "localhost")
    
    'Convert in parameters in case contain spaces, accents, etc.
    Dim postData As String = String.Format("db={0}&query={1}", _
                         HttpUtility.UrlEncode("books.sqlite"), _
                         HttpUtility.UrlEncode("SELECT id,title FROM books"))
    
    RichTextBox1.Text = client.UploadString(New Uri(strURL), "POST", postData)
End Sub

【问题讨论】:

  • 我几乎不敢问,但您真的要执行从系统外部发送给您的 SQL 查询吗?
  • 这与 POST 没有太大关系,但似乎使用 .NET 的 SQLite 库(例如 sqlite.phxsoftware.com)可以更轻松地完成您所做的事情。
  • 服务器将永远无法从网络访问,并将位于防火墙后面的 LAN 上。我将研究如何从参数构建查询,而不是让客户端发送完整的查询。我还没有找到 SQLite 服务器,所以需要自己构建。

标签: vb.net post webforms


【解决方案1】:

由于您使用“localhost”作为 Web 客户端的目标,因此我假设您也可以控制该站点。通过该站点的查询字符串接受 SQL 是一个非常糟糕的主意。

因此,您的问题的答案是重新编写您的网站,以便它只期望插入查询的参数而不是查询本身。

您的代码的其他一些问题:

  • WebClient 实现了 IDisposable,因此应该使用 using 块创建
  • 我认为 UploadData() 可能是调用错误的函数 - 您期望来自服务器的响应,不是吗?尝试 DownloadString() 代替;它仍会发布您的数据。
  • 我将为您提供疑问,并假设“Exit Sub”行用于调试,但值得一提的是,断点会更好地为您服务。

【讨论】:

  • 感谢 IDisposable 的提示。这段代码仅供学习,实际的SQL查询将由服务端根据客户端发送的参数生成。
猜你喜欢
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
相关资源
最近更新 更多