2011-10-26 15 views
6

POSTパラメータをサーバーコールにエンコードする最善の方法を考え出すのに問題があります。 PHPサーバーが提供するC#クライアントを作成しています。私はパラメータに大きな柔軟性を持たせたいので、私の現在の計画はJSONを使ってエンコードする単一のパラメータを持つことです。例えば:HTTP POSTパラメータ(C#クライアントからPHPサーバ)をエンコードする方法は?

params = {"object":"Main","function":"doecho","params":["echothis...."]} 

私のC#WebRequestクラスオブジェクトとcontentType使用している "アプリケーション/ x-www-form-urlencodedでは、文字セット= UTF-8"。データがサーバーに到達し、データに不正なJSON文字を追加するまで、すべてが正常に機能します。

たとえば、次のデータを使用すると、サーバー側でjson_decodeを実行できません。サーバーは、私はの$ this - >のGetRequest()でそれを読んだときに自動的に二重引用符( ")に40%を回すように見える - >のgetParams();(Zend_Framework)

params = {"object":"Main","function":"doecho","params":["echothis%25%5d%22%40%3d%26...."]} 

何が最善かここで練習しますか?base64でデータをエンコードする必要がありますか?コンテンツタイプやPHP設定に欠けていることがありますか?

私はクライアントとサーバーを完全にコントロールしています。

答えて

8

潜在的に任意のコンテンツタイプは、HTTPにアップロードするために使用することができますが、実際に使用される3つがあります。具体的に特定のサービスのマニュアルで設定された

  1. 一つ。
  2. application/x-www-form-urlencoded - HTMLフォームで使用されるデフォルトです。
  3. multipart/form-data - HTMLフォームで使用されるもう1つのフォーム。フォームのアップロードが必要な場合に必要です。

2と3は一般的に使用されているため(すべてのブラウザがフォームを送信するためにサポートされているため)、ほとんどすべてのサーバーサイドの技術に対応できます。だから、PHPの部分が何か変なことをしない限り、あなたはどちらかを使うことができるはずです。

application/x-www-form-urlencodedは、一部のデータには適切ではありませんが、使用されているものの中では最も簡単です。これは、GETフォーム要求に対してクエリ文字列が作成される方法と同じですが、POSTコンテンツとして作成されます。

したがって、あなたがあなたのコンテンツになりたい:

params=%7B%22object%22%3A%22Main%22%2C%22function%22%3A%22doecho%22%2C%22params%22%3A%5B%22echothis....%22%5D%7D 

そして第二:

params=%7B%22object%22%3A%22Ccmes_Main%22%2C%22function%22%3A%22doecho%22%2C%22params%22%3A%5B%22echothis%2525%255d%2522%2540%253d%2526....%22%5D%7D 

両方のPHPの組み込み関数など最初になるよう

"params=" + Uri.EscapeDataString(paramData) 

あなたの質問のフォームに戻ります。

+0

はい、これは私には意味があります。ありがとう! – Jeff

+0

ニットピッキングはバグを防ぐことができるので、 "params"(しかし "="も)はURIエンコードされるべきであることに注意してください。私は、URIエンコードされた "params"がまだ "params"であることを知っているので、私はショートカットとしてではありませんが、 "prams"または "params"だったら、 –

1

私の最初の考えは、それをbase64としてエンコードしていました。私はこれがシンプルでなければならないと思います。

arcanecode.comから:

static public string EncodeTo64(string toEncode) 
{ 
    byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode); 
    string returnValue = System.Convert.ToBase64String(toEncodeAsBytes); 
    return returnValue; 
} 
+0

最初の例が機能していた場合、最初の例はBase-64ではなかったため、これは正しくありません。 –

+0

Jon Hanna、EncodeTo64関数(hichaeretaquaの答え)は、文字列をASCIIバイトのHeximal表現でエンコードするためのものです。 –

関連する問題