POST mittels XMLHTTPRequest an SOASP

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • POST mittels XMLHTTPRequest an SOASP

    Die alte Überschrift ist nicht mehr gültig. Das Problem ist ein anderes als ich ursprünglich vermutete ...

    ===========================================

    Form.serialize() in FF3

    Guten morgen!

    Mir stellt sich folgendes Problem:

    Ich serialisiere ein Formular, das aus "statischen" Formularfeldern und "dynamischen" Forrmularfeldern besteht. Die "statischen" werden bereits beim Aufruf der Seite dargestellt, die "dynamischen" werden mittels Prototypes Ajax.Updater in das Formular eingebunden.

    Serialisiere ich nun das ganze Formular, so werden nur die "statischen" nicht aber die "dynamischen" Formularfelder erfaßt und an den Server übermittelt.

    Dieses Verhalten beobachte ich ausschließlich im FF3! Im FF2 und IE werden alle Formularfelder erfaßt.

    Kennt jemand dieses Verhalten? Wie kann ich das Problem lösen, oder wo könnte ich weiterlesen?

    Ich habe im Netz zwar ein ähnliches Problem gefunden (groups.google.com/group/protot…d/thread/02583700b46e12d7) aber da lag es an invalidem (X)HTML der dynamisch nachgeladenen Formularfelder. Das kann ich bei mir aber ausschließen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Marcus Gnaß ()

  • Hi,
    ich habe mal ein Minimalbeispiel gebaut... das funktioniert einwandfrei:

    Quellcode

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    4. <head>
    5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    6. <script src="/prototype.js" type="text/javascript"></script>
    7. </script>
    8. </head>
    9. <body>
    10. <form id="person-example" class="example" action="#" onsubmit="alert($(this).serialize()); return false">
    11. <fieldset><legend>User info</legend>
    12. <div><label for="username">Username:</label> <input type="text" name="username" id="username" value="" /></div>
    13. <div><label for="age">Age:</label> <input type="text" name="age" id="age" value="" size="3" /></div>
    14. <div><label for="hobbies">Your hobbies are:</label>
    15. <select name="hobbies" id="hobbies" multiple="multiple">
    16. <option>coding</option>
    17. <option>swimming</option>
    18. <option>hiking</option>
    19. <option>drawing</option>
    20. </select>
    21. </div>
    22. <div id="insert">
    23. </div>
    24. <div class="buttonrow"><input type="submit" value="serialize!" /></div>
    25. </fieldset>
    26. </form>
    27. <script type="text/javascript">
    28. new Ajax.Updater('insert', 'status.php');
    29. </script>
    30. </body>
    31. </html>
    Alles anzeigen


    status.php liefert

    Quellcode

    1. <input type="text" name="hobbies3" value="foo">
  • Grumpf! ;)

    OK, werd ich morgen ausprobieren ... das beraubt mich aber jeder Illusion ... da steht wohl noch ein wenig Recherche an. Ich meld mich wieder! ;)

    Edit: Welche Prototypeversion hast du verwendet?
    Ich hab bisher die Prototype-Versionen 1.4 und 1.5 aus Scriptaculous 1.5.0, 1.5.3 bzw. 1.8.1 ausprobiert.
    Aber alle Versionen haben bei mir dasselbe Verhalten gezeigt.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Marcus Gnaß ()

  • Ich habs nochmal ausprobiert und bin ein wenig am Verzweifeln ... vergiß zunächst mein Beispiel, da stecken noch andere Fehler drin. Ich hab gestern nochmal rumgetestet und mußt schließlich feststellen, daß das Serialisieren des Formulares funktioniert! (Komisch, vorher war da der Fehler ... versteh ich nicht). Die Daten werden (auch laut Firebug) richtig übermittelt. Nur kommen sie nicht auf dem Server an. Unabhängig, davon ob es sich um "statische" oder "dynamische" Felder handelt. Ich vermute aber ein Encodingproblem, da die Seite Latin1 ist, die nachgeladenen Felder aber UTF8 (geht glaub ich auch nicht anders). Ich werde heute nochmal weitertesten und mich dann wieder melden. Danke für deine Hilfe soweit!!!
  • Das Serialisieren des Formulares funktioniert wunderbar! Der POST-Request wird auch ordentlich erzeugt (Hab ich mittels FireBug geprüft).
    Der Request wird von PHP korrekt interpretiert. Allerdings bereitet mir mein ASP Kopfzerbrechen.
    Lasse ich den Browser den Submit durchführen, so werden die Daten im RequestBody korrekt ausgelesen.
    Verwende ich aber einen XMLHTTPRequest (oder eben Prototype) im Firefox 3 werden die Daten nicht korrekt ausgelesen.
    Mit dem Internet Explorer und Firefox 2 taucht dieses Problem nicht auf.
    Die Schwierigkeit besteht nun darin, daß ich Sun Java System Active Server Pages 4.0 (sun.com/software/chilisoft/) verwende.
    Dabei handelt es sich allerdings um eine veraltete Software und ich schätze der Fehler liegt bei denen. Auf Patches hoffe ich aber wohl vergeblich.
    Nun bleibt mir nur noch der Weg es mit Beans zu versuchen, die ich statt COM-Komponenten verwenden kann ... wenn ich mehr weiß melde ich mich wieder.
  • Also das war meine HTML-Seite:

    ff3_test.html

    Quellcode

    1. <!DOCTYPE html PUBLIC
    2. "-//W3C//DTD XHTML 1.0 Transitional//EN"
    3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    4. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    7. <script type="text/javascript" src="../share/scriptaculous-js-1.8.1/lib/prototype.js"></script>
    8. <script type="text/javascript" src="ff3_test.js"></script>
    9. <title>FF3-Test</title>
    10. </head>
    11. <body>
    12. <form id="form" action="#" method="post">
    13. <fieldset>
    14. <div><input type="button" value="Prototype =&gt; ASP" onclick="javascript: postFormViaPrototype('asp');" /></div>
    15. <div><input type="button" value="Prototype =&gt; PHP" onclick="javascript: postFormViaPrototype('php');" /></div>
    16. <div><input type="button" value="XMLHttpRequest =&gt; ASP" onclick="javascript: postFormViaXMLHttpRequest('asp');" /></div>
    17. <div><input type="button" value="XMLHttpRequest =&gt; PHP" onclick="javascript: postFormViaXMLHttpRequest('php');" /></div>
    18. </fieldset>
    19. <fieldset>
    20. <div><input type="text" id="staticfield" name="static" value="foo" /></div>
    21. <div id="result">result</div>
    22. </fieldset>
    23. </form>
    24. </body>
    25. </html>
    Alles anzeigen


    ff3_test.js

    Quellcode

    1. function postFormViaXMLHttpRequest(target) {
    2. var xhr;
    3. try {
    4. xhr = new ActiveXObject('Msxml2.XMLHTTP');
    5. } catch (err1) {
    6. try {
    7. xhr = new ActiveXObject('Microsoft.XMLHTTP');
    8. } catch (err2) {
    9. try {
    10. xhr = new XMLHttpRequest();
    11. } catch (err3) {
    12. xhr = false;
    13. }
    14. }
    15. }
    16. if (xhr) {
    17. xhr.open('POST', '/test/ff3_test_post.' + target, false);
    18. xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    19. xhr.send('static=' + document.getElementById('staticfield').value);
    20. alert(xhr.responseText);
    21. }
    22. }
    23. function postFormViaPrototype(target) {
    24. var serializedForm = $('form').serialize(true);
    25. var ajax = new Ajax.Updater(
    26. 'result', '/test/ff3_test_post.' + target,
    27. {method: 'post', parameters: serializedForm}
    28. );
    29. }
    Alles anzeigen



    Zusätzlich habe ich noch folgende Scripte im Backend:

    ff3_test_post.asp

    Quellcode

    1. <%
    2. Option Explicit
    3. Dim strKey
    4. Response.Write "<p><b>REQUEST_METHOD</b>: " & Request.ServerVariables("REQUEST_METHOD") & "</p>"
    5. Response.Write "<b>Request.Form</b>"
    6. Response.Write "<ul>"
    7. For Each strKey In Request.Form
    8. Response.Write "<li>" & strKey & ": " & Request.Form(strKey) & "</li>"
    9. Next
    10. Response.Write "</ul>"
    11. Response.Write "<b>Request.QueryString</b>"
    12. Response.Write "<ul>"
    13. For Each strKey In Request.QueryString
    14. Response.Write "<li>" & strKey & ": " & Request.QueryString(strKey) & "</li>"
    15. Next
    16. Response.Write "</ul>"
    17. Dim objRequest
    18. Set objRequest = NewJavaObject("RequestTest")
    19. Response.Write "static: " & objRequest.getParam("static")
    20. Response.Write "dynamic: " & objRequest.getParam("dynamic")
    21. Set objRequest = Nothing
    22. %>
    Alles anzeigen


    ff3_test_post.php

    Quellcode

    1. <?php
    2. echo 'PHP: ';
    3. echo '<br />content: ' . $_POST['content'];
    4. echo '<br />static: ' . $_POST['static'];
    5. echo '<br />dynamic: ' . $_POST['dynamic'];
    6. ?>


    RequestTest.java

    Quellcode

    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.HttpServletRequest;
    3. import com.sun.asp.AspContext;
    4. class RequestTest {
    5. HttpServletRequest request = null;
    6. public RequestTest() {
    7. request = AspContext.getScriptingContext().getRequest();
    8. }
    9. public String getParam(String key)
    10. throws ServletException {
    11. if (null==request)
    12. throw new ServletException("kein Request");
    13. return request.getParameter(key);
    14. }
    15. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Marcus Gnaß ()