-2

AJAX を使用してフォームを投稿する

私の AJAX スクリプトは以前は機能していませんでしたが (データを送信しませんでした)、要求ヘッダーを設定すると問題が解決しました。それが機能するのは素晴らしいことですが、機能するためになぜそれらが必要なのかを理解したいと思います. ありがとう :-)

//Send the proper header information along with the request 
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
http.setRequestHeader("Content-length", params.length); 
http.setRequestHeader("Connection", "close"); 

JavaScript

function request(elm, type, url, str, fn) { 
var xhr = new XMLHttpRequest();
xhr.onreadystatechange=function()
{
    if (xhr.readyState==4 && xhr.status==200)
    {
        if (!fn) elm.innerHTML=xhr.responseText; 
        else fn(xhr);
    }
}
      xhr.open(type, url, true);
      //yay it works with this :-)
      xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      xhr.send(str);
}

var form = document.getElementById("form_login")
var btnLogin = form.getElementsByClassName("btn")[0];
addEvent(btnLogin, "click", function(e) 
{
    preventDefault(e);
    var post ="",input,inputs = form.getElementsByClassName("input");
    for (var i=0, l=inputs.length; i<l; i++) 
    {
        input = inputs[i].getElementsByTagName("input")[0];
        post += input.name + "=" + encodeURI(input.value) + "&";
    }
    post = post.substr(0,post.length-1);
    var help = form.getElementsByClassName("help")[0];
    request(help, "POST", "user/login-exe.php?dt='" + new Date() + "'", post);
});

そのすべてが有効な場合、ユーザーはそのビットにログインしますが、表示されません。

4

2 に答える 2

3

$_POSTこれは厳密な要件ではありません。リクエストで content-type of が指定されている場合、PHP は自動的に入力します"application/x-www-form-urlencoded"

あなたはまだ値にアクセスすることができます

file_get_contents("php://input");

実際、どのサーバーでも生のリクエスト本文へのアクセスを許可する必要があります。

他のヘッダーは何もしていません。ブラウザーは、指定されたようにそれらを変更することを許可しません。Content-Lengthそれらを変更できた場合、おそらく毎回間違っていると報告するでしょう。asはバイト単位である必要がある.lengthUTF-16 コード単位をカウントするためです。Content-Length

参照: http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method

ヘッダーが次のヘッダーのいずれかと大文字と小文字を区別しないで一致する場合は、これらの手順を終了します。

  • Accept-Charset
  • Accept-Encoding
  • アクセス制御要求ヘッダー
  • Access-Control-Request-メソッド
  • 繋がり
  • コンテンツの長さ
  • クッキー
  • Cookie2
  • コンテンツ転送エンコーディング
  • 日にち
  • 予想
  • ホスト
  • 生き続ける
  • リファラー
  • トレーラー
  • 転送エンコーディング
  • アップグレード
  • ユーザーエージェント
  • 経由
于 2012-08-12T12:36:51.773 に答える
0

1.) の「Content-type」ヘッダー<form>:content-typeサーバーにフォーム データを送信する際に、フォーム データ セットをエンコードするように指定します。

application/x-www-form-urlencoded: フォームのデータを次のようにエンコードすることを示します。) コントロールの名前と値は、表示される順序でリストされます。コントロール名とその値は「=」で区切られ、コントロール名と値は「&」で区切られます。 b) コントロール名と値はエスケープされます。RFC1738で説明されているように、スペース文字は「+」に置き換えられ、その他の予約文字はエスケープされます。

2) "Content-length" : このヘッダーは、メッセージ本文のサイズを 10 進数のオクテットで示します。HTTP ヘッダーの "Content-Length" フィールドとは何ですか?

3) 接続: 接続の状態。

「接続」の設定は必須ではないと思います。

于 2012-08-12T12:49:19.293 に答える