php ajaxデータコミットpostとpostの一般的な方法のまとめ

5312 ワード

この例では、phpがajaxデータを用いてpostとpostをコミットする一般的な方法について説明します.皆さんの参考にしてください.具体的な方法は以下の通りです.
多くの場合ajaxを使用しても問題はありませんが、ajaxデータのpostコミットが不完全な問題に遭遇することがあります.ここでは例を挙げて分析します.
下は標準的なajaxリクエストコードで、通常は何の問題もありませんが、特定の状況で問題が発生します.例えば、username=fdas&321の時、あるいはパラメータ値に&記号が現れ、N回以上のテストを経て、データが転送されたことがわかりますが、印刷されたデータは半分です.最後に、ヘッダ情報をよく観察すると、送信されたヘッダが間違っていて、問題がjsに位置決めされていることがわかり、文字列の接合方法がこの問題username=fdas&321&password=passwordをもたらすことがわかりました.これは間違っています.だから私たちは伝送したデータを{username:username,password:password}というjsonフォーマットに変えて問題を避ける必要があります!
サンプルコードは次のとおりです.

   $(".submit").bind('click',function(){ 
  
var username = $("input[name='username']").val();
$.ajax({
url:"post",
type:"post",
dataType:"json",
data:"username="+username+"&password="+password,
timeout:5000,
error:function(){
alert(1)
},
success:function(){
}
})
})

補足:4つの一般的なPOST提出データ方式
① application/x-www-form-urlencoded
これは最も一般的なPOSTがデータを提出する方法であるはずです.ブラウザのオリジナルformフォームは、enctypeプロパティを設定しないと、最終的にアプリケーション/x-www-form-urlencoded方式でデータがコミットされます.リクエストは以下のようになります(関係のないリクエストヘッダは本明細書では省略されています):

   POST //www.jb51.net HTTP/1.1 
  
Content-Type: application/x-www-form-urlencoded;charset=utf-8
 
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

まず、Content-Typeはアプリケーション/x-www-form-urlencodedとして指定されます.次に、コミットされたデータはkey 1=val 1&key 2=val 2のように符号化され、keyとvalはURLトランスコードされている.ほとんどのサービス側言語は、この方法をよくサポートしています.例えばPHP中、$POST['title']はtitleの値、$_を取得できます.POST['sub']はsub配列を得ることができる.
多くの場合、Ajaxでデータをコミットする場合も、この方法を使用します.たとえばJQueryとQWrapのAjaxでは、Content-Typeのデフォルト値は「アプリケーション/x-www-form-urlencoded;charset=utf-8」です.
② multipart/form-data
これはまた、一般的なPOSTデータの提出方法です.フォームを使用してファイルをアップロードする場合は、formのenctypedをこの値に等しくする必要があります.リクエストの例を直接見てみましょう.

   POST //www.jb51.net HTTP/1.1 
  
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
 
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
 
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
 
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

この例は少し複雑です.まずboundaryを生成して異なるフィールドを分割し,本文の内容と重複しないようにboundaryは長く複雑である.そしてContent-Typeでは、データがmutipart/form-dataで符号化されていることを示しています.今回要求されたboundaryは何ですか.メッセージボディには、フィールドの数によって複数の構造が似ている部分があり、各部分は--boundaryで始まり、コンテンツ記述情報に続いて、車に戻り、最後にフィールドの具体的な内容(テキストまたはバイナリ)である.ファイルが転送されている場合は、ファイル名とファイルタイプ情報も含まれます.メッセージ・ボディは最後に--boundary--で終了します.mutipart/form-dataの詳細な定義については、rfc 1867に行って参照してください.
この方法は一般的にファイルをアップロードするために使用され、各サービス側の言語もサポートされています.上記の2つのPOSTデータの方式は、いずれもブラウザがオリジナルでサポートしており、現段階ではオリジナルformフォームもこの2つの方式しかサポートしていない.しかし、ますます多くのWebサイト、特にWebAppがAjaxを使用してデータのインタラクションを行うにつれて、新しいデータの提出方法を完全に定義することができ、開発により多くの便利さをもたらします.
③ application/json
Application/jsonというContent-Typeは応答ヘッドとしてよく知られているに違いない.実際には,サービス側メッセージ主体がシーケンス化されたJSON文字列であることを示すリクエストヘッダとして利用する人が増えている.JSON仕様の流行により、低バージョンIEを除く各ブラウザはJSONを原生サポートしている.stringify、サービス側言語にもJSONを扱う関数があり、JSONを使うとトラブルに遭うことはありません.
JSON形式では,キー値よりもはるかに複雑な構造化データをサポートすることも有用である.私が数年前にプロジェクトをした時、提出しなければならないデータの階層はとても深くて、私はデータJSONをシーケンス化してから提出したのを覚えています.しかし当時私はJSON文字列をvalとしてキー値ペアに入れ、x-www-form-urlencoded方式で提出しました.
GoogleのAngularJSのAjax機能は、デフォルトではJSON文字列がコミットされます.たとえば、次のコードを使用します.

   var data = {'title':'test', 'sub' : [1,2,3]}; 
  
$http.post(url, data).success(function(result) {
...
});

最終的に送信されるリクエストは次のとおりです.

   POST //www.jb51.net HTTP/1.1 
  
Content-Type: application/json;charset=utf-8
 
{"title":"test","sub":[1,2,3]}

この方式は,複雑な構造化データを容易に提出でき,特にRESTfulのインタフェースに適している.Chromeが持参した開発者ツール、Firebug、Fiddlerなど、各パッケージツールは、JSONデータをツリー構造で表示し、非常に友好的です.しかし、phpが$_を通過できないなど、サービス側言語ではサポートされていないものもあります.POSTオブジェクトは、上記の要求からコンテンツを取得する.この場合、リクエストヘッダにContent-Typeがアプリケーション/jsonである場合、php://inputで元の入力ストリームを取得し、json_decodeがオブジェクトになります.いくつかのphpフレームワークはすでにこのようにしています.
もちろんAngularJSはx-www-form-urlencoded方式でデータをコミットするように構成することもできます.
④ text/xml
これを前提としてXML-RPC(XML Remote Procedure Call)へ.伝送プロトコルとしてHTTP,符号化方式としてXMLを用いたリモートコール仕様である.典型的なXML-RPCリクエストは次のとおりです.

   POST //www.jb51.net HTTP/1.1 
  
Content-Type: text/xml
 


examples.getStateName


41
 


XML-RPCプロトコルは簡単で、機能が十分で、各種言語の実現があります.WordPressのXML-RPC Api,seo/seoなど、広く使われています.html"target="_blank">検索エンジンのpingサービスなど.JavaScriptでは、既存のライブラリでこのようなデータインタラクションをサポートしているものもあり、既存のXML-RPCサービスをうまくサポートしている.ただし、個人的にはXMLの構造が肥大化しすぎて、一般的なシーンはJSONの方が柔軟で便利だと思う.
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.