#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). Это решение этой проблемы.