ホームページ >バックエンド開発 >PHPチュートリアル >JavaScript - WeChat エンタープライズ アカウント: JSON データを POST してエンタープライズ アカウントのメンバーにメッセージを送信する方法
Enterprise Account 開発者ドキュメントのメッセージ送信インターフェイスのメッセージ データ形式に従って、Enterprise Account メンバーにメッセージを送信する場合は、POST を使用して、ACCESS_TOKEN を含む指定された URL に JSON データを送信する必要があります。
私が実現したいのは、定期的にデータベースにクエリを実行し、クエリ結果に基づいて特定のメンバーにメッセージを送信することです。
Linux サーバーのシェルで コマンドを記述することで、JSON データを正常に POST できます。また、ドキュメントとデータ形式の理解に問題がないことを示すメッセージも携帯電話に受信しました。ただし、この方法では、取得した ACCESS_TOKEN HARD CODE をコマンド ラインに入力する必要があり、TOKEN には期限があるため、テストにのみ使用でき、運用環境では使用できません。 curl
まず、実現可能性だけを考えるとjQueryのajaxメソッドで実装できるでしょうか?
私の実験では、まず PHP を使用して正しい TOKEN を取得し、URL を構築し、次に URL 値を JavaScript 変数 url に渡し、コンソールで試しました
リーリー
。
しかし、$.ajax によって返されるオブジェクト .responsText では、POST の結果が
であることがわかります。array(0) {}
そこで最初の質問は、$.ajaxで送信されたJSON形式のデータを$_POSTで受信できない場合、送信されたデータをサーバー側でどのように読み取ればよいのでしょうか?AJAX メソッドの datetype と contenttype を削除すると、responseText に正しいデータが表示されます。
さらに、POST に関するいくつかのドキュメントを読みました。正しく理解していれば、POST によって送信される情報は実際には 2 つの部分で構成されており、1 つは HEADER で、もう 1 つは DATA です。また、JSON データを POST する方法についても調べました。 PHPでは、JSONをPOSTする前にある程度のHEADERを制御する必要があると書かれていることが多いようですが、これはJavaScriptでは実現できないということでしょうか?
最後に、次の関数を使用します
リーリーデータを送信するフォームをシミュレートして、試してみます
リーリーdata=%7B%22touser%22%3A%22shenkwen%22%2C%22msgtype%22%3A%22text%22%2C%22agentid%22%3A23%2C%22text%22%3A%7B%22content%22% 3A%22テスト+メッセージ%22%7D%7D
json文字列がurlencodeされているようですが、これは今回必要なjsonデータをフォームに送信することができないことを意味しますか?
返信内容: Enterprise Account 開発者ドキュメントのメッセージ送信インターフェイスのメッセージ データ形式に従って、Enterprise Account メンバーにメッセージを送信する場合は、POST を使用して、ACCESS_TOKEN を含む指定された URL に JSON データを送信する必要があります。私が実現したいのは、定期的にデータベースにクエリを実行し、クエリ結果に基づいて特定のメンバーにメッセージを送信することです。
Linux サーバーのシェルでコマンドを記述することで、JSON データを正常に POST できます。また、ドキュメントとデータ形式の理解に問題がないことを示すメッセージも携帯電話に受信しました。ただし、この方法では、取得した ACCESS_TOKEN HARD CODE をコマンド ラインに入力する必要があり、TOKEN には期限があるため、テストにのみ使用でき、運用環境では使用できません。
実稼働環境での私の解決策は、メッセージを送信するための PHP/JAVASCRIPT プログラムを作成し、サーバー側で CRON JOB を使用して PHP プログラムを定期的に実行することです。しかし、POST 原理の理解が不十分なため、具体的な実装プロセス中に多くの問題が発生しました。 curl
私の実験では、まず PHP を使用して正しい TOKEN を取得し、URL を構築し、次に URL 値を JavaScript 変数 url に渡し、コンソールで試しました
リーリーコンソールがクロスドメインエラーを返しました。クロスドメインの問題により、返された成功または失敗の情報が表示されないことを理解しています
。
しかし、私の携帯電話には何もメッセージが届かなかったので、送信は失敗したはずです。上記のコードによってどのようなデータが送信されるかを確認するために、別のファイルを使用してデータを受信します。
リーリー
しかし、$.ajax によって返されるオブジェクト .responsText では、POST の結果が
array(0) {}
如果我把AJAX方法中的datetype和contenttype去掉,在responseText中就能看到正确的数据。所以,第一个问题是,如果$.ajax发送的JSON格式的数据不能被$_POST接收到,在服务器端应如何读取发送的数据呢?
此外,我读了一些关于POST的文档,如果没有理解错的话,实际上POST传递的信息由两部分组成,一是HEADER,一是DATA;我也搜寻了一些关于如何通过PHP POST JSON数据的文章,读的不是很懂,似乎大部分文章都是说要先对HEADER进行一定程度的控制,然后才能POST JSON,这是不是意味着用javascript就无法实现呢?
最后,我用以下函数
<code>function gotoUrl(path, params, method) { //Null check method = method || "post"; // Set method to post by default if not specified. // The rest of this code assumes you are not using a library. // It can be made less wordy if you use one. var form = document.createElement("form"); form.setAttribute("method", method); form.setAttribute("action", path); //Fill the hidden form if (typeof params === 'string') { var hiddenField = document.createElement("input"); hiddenField.setAttribute("type", "hidden"); hiddenField.setAttribute("name", 'data'); hiddenField.setAttribute("value", params); form.appendChild(hiddenField); } else { for (var key in params) { if (params.hasOwnProperty(key)) { var hiddenField = document.createElement("input"); hiddenField.setAttribute("type", "hidden"); hiddenField.setAttribute("name", key); if(typeof params[key] === 'object'){ hiddenField.setAttribute("value", JSON.stringify(params[key])); } else{ hiddenField.setAttribute("value", params[key]); } form.appendChild(hiddenField); } } } document.body.appendChild(form); form.submit(); } </code>
模拟一个表单提交数据,然后我尝试
<code>gotoUrl(url,'{"touser":"shenkwen","msgtype":"text","agentid":23,"text":{"content":"test message"}}') 给url加上一个debug=1参数的话,可以看到postdata,以上代码的postdata是这样的: </code>
data=%7B%22touser%22%3A%22shenkwen%22%2C%22msgtype%22%3A%22text%22%2C%22agentid%22%3A23%2C%22text%22%3A%7B%22content%22%3A%22test+message%22%7D%7D
看起来是把json字符串urlencode了,这是不是意味着在这个场合中所要求的json数据根本无法用表单方式提交?
contentType也可以指定为 urlencode的。