HTML-данные, отправленные через HttpWebRequest в vb.net пусты, когда они попадают в php ‘s $_POST

#php #html #vb.net #post #httpwebrequest

#php #HTML #vb.net #Публикация #httpwebrequest

Вопрос:

Справочная информация: Я выполнял междоменные ajax-вызовы со страницы, поддерживающей только HTML (без серверного программирования), на серверную часть PHP в другом домене. В какой-то момент я понял, что не могу выполнять POST с помощью междоменного, поэтому я решил, что мне нужен локальный прокси. К сожалению, PHP недоступен в этом домене, поэтому мне приходится прибегать к ASP.NET.

Итак, я создал очень быстрый и грязный vb.net прокси… Это работает, за исключением одной очень важной детали. Если какое-либо из полей моей формы содержит HTML, данные не отправляются на PHP (или PHP не получает их, я не уверен). На самом деле, переменная $_POST существует, она просто пуста все время, как только она содержит то, что выглядит как html-код, например amp;<pamp;> . Это же поле, если оно не содержит HTML-тег, будет работать нормально, и данные будут переданы на страницу PHP.

Это код прокси, который я использую:

 <%@ Page Language="VB" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Net" %>
<script runat="server">
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            Dim displayValues As New StringBuilder()
            Dim postedValues As NameValueCollection = Request.Form
            Dim nextKey As String
            For i As Integer = 0 To postedValues.AllKeys.Length - 1
                nextKey = postedValues.AllKeys(i)
                If nextKey.Substring(0, 2) <> "__" Then
                    displayValues.Append("amp;" amp; nextKey)
                    displayValues.Append("=")
                    'displayValues.Append(postedValues(i))
                    displayValues.Append(Server.UrlEncode(postedValues(i)))
                End If
            Next

            ' here, both postedValues(2) and Request.Form("htmldata") contain the correct HTML data.
            Dim uri As New Uri("http://www.myotherdomain/folder/page.php")
            Dim data As String = displayValues.ToString
            'Here, data contains the correct HTML code along with the other POST variables.
            If (uri.Scheme = uri.UriSchemeHttp) Then
                Dim request As HttpWebRequest = HttpWebRequest.Create(uri)
                request.Method = WebRequestMethods.Http.Post
                request.ContentLength = data.Length
                request.ContentType = "application/x-www-form-urlencoded"
                Dim writer As New StreamWriter(request.GetRequestStream())
                writer.Write(data)
                writer.Close()

                Dim myResponse As HttpWebResponse = request.GetResponse()
                Dim reader As New StreamReader(myResponse.GetResponseStream())
                Dim responseString As String = reader.ReadToEnd()
                myResponse.Close()
                Response.Write(responseString)
            End If
        End If
    End Sub
</script>
  

О, на стороне PHP, все, что я делаю, это $var = $_POST["htmldata"]; , и $var всегда пусто. Я бы привел пример моего PHP, но я не знаю, нужно ли это. $_POST["action"] например, содержит правильное действие, которое я ожидаю, так что ошибочен не сам PHP-код.

Кто-нибудь имеет представление о том, что здесь происходит?

=== РЕДАКТИРОВАТЬ ===

Что ж, если вы кодируете HTML так, чтобы html-объекты передавались правильно (не как amp;< ), это работает!

Позвольте мне назвать это: n00b! 😛

(Исправленный код)

Комментарии:

1. попробуйте выполнить print_r($_REQUEST); и посмотрите, есть ли здесь что-нибудь. Это должно отображать ваши данные GET и POST, и вы должны быть в состоянии определить, передается ли что-либо в PHP из вашего кода VB или нет

2. DaOgre, print_r($_REQUEST); выдает мне то, что я ожидал: Array ( [jsoncallback] => abc123blahblahblah [loginCookie] => 234i5uy9a8fd6ybuoihqw4 [page] => Welcome.html [htmldata] => ) , поэтому он пуст.

3. После небольшой возни, вот что я нахожу. На самом деле не все HTML-объекты останавливают это. Я только что понял, что все мои HTML-тесты начинались (очевидно) с < , который начинается с amp; , который в моей строке является началом новой переменной (которая никогда не вызывается, поэтому я ее не вижу). Ита к, мне интересно, есть ли другой способ отправить данные POST вместо строки, разделенной амперсандом…

4. — Примечание — Это было исправлено. Если кто-то хочет бесплатные баллы, скажите мне, как я должен использовать Server. URLEncode, как и n00b, которым я являюсь.

5. @Эрик-Себастьян Лашанс: Вы могли бы ответить на свой собственный вопрос и получить эти «бесплатные баллы», а также пометить его как ответ. 🙂

Ответ №1:

После некоторого исследования кажется, что я забыл закодировать HTML-данные с помощью Server.URLEncode (эквивалент encodeURI в javascript). Это решение этой проблемы.