POST переменные для веб-сервера? - PullRequest
0 голосов
/ 03 мая 2010

Я пробовал несколько вещей от Google до POST-данных на веб-сервере, но ни одна из них не работает: я все еще застрял в том, как преобразовать переменные в запрос, учитывая, что вторая переменная является запросом SQL поэтому у него есть пробелы.

Кто-нибудь знает правильный способ использования WebClient для POST-данных? Я бы лучше использовал WebClient, потому что он требует меньше кода, чем HttpWebRequest / HttpWebResponse.

Вот что я попробовал до сих пор:

Private Sub Button1_Click (отправитель ByVal как System.Object, ByVal e как System.EventArgs) Обрабатывает 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

1 Ответ

3 голосов
/ 03 мая 2010

Поскольку вы используете "localhost" в качестве цели для своего веб-клиента, я предполагаю, что вы также контролируете этот сайт. Принятие SQL через строку запроса для этого сайта является исключительно плохой идеей.

Тогда ответ на ваш вопрос заключается в том, чтобы переписать ваш веб-сайт таким образом, чтобы он ожидал, что в запрос будут включены только параметры, а не сам запрос.

Некоторые другие проблемы с вашим кодом:

  • WebClient реализует IDisposable, поэтому его следует создавать с использованием блока использования
  • Я думаю, что UploadData (), вероятно, неправильная функция для вызова - вы ожидаете ответа от сервера, не так ли? Вместо этого попробуйте DownloadString (); он по-прежнему будет публиковать ваши данные.
  • Я дам вам преимущество сомнения и предположу, что строки «Exit Sub» предназначены для отладки, но стоит упомянуть, что точки останова будут вам полезнее.
...