この記事では、主に PHP バックエンドとモバイル APP インターフェイス開発のサンプル コードを共有し、皆様のお役に立つことを願っています
1. モバイル APP (クライアント) プログラム インターフェイス
ここでは、PC 上で C++ プログラムを使用して HTTP プロトコル データの POST をシミュレートします。
#include <iostream> #include <fstream> #include <cstdlib> #include <cstring> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> using namespace std; #define DEST_IP "10.209.177.22" #define DEST_PORT 80 #define MAX_DATA_SIZE 1024 int main() { int ret; int sockfd; struct sockaddr_in dest_addr; memset(&dest_addr, 0x00, sizeof(sockaddr_in)); dest_addr.sin_family = AF_INET; dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); dest_addr.sin_port = htons(DEST_PORT); cout << "dest addr IP:" << inet_ntoa(dest_addr.sin_addr) << endl; sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sockfd < 0) { cout << "create socket fail!" << endl; exit(1); } ret = connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)); if (ret != 0) { cout << "connect server fail!" << endl; close(sockfd); exit(1); } else { cout << "connect server success!" << endl; } cout << endl; int sendlen, recvlen; char sendbuf[MAX_DATA_SIZE] = {0}; char recvbuf[MAX_DATA_SIZE] = {0}; string body("user=hello&password=123456"); int content_length = body.length(); snprintf(sendbuf, sizeof(sendbuf) - 1, "POST /api.php HTTP/1.1\r\n" "Host: 10.209.177.22\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "Content-Length: %d\r\n", content_length ); strcat(sendbuf, "\r\n"); strcat(sendbuf, body.c_str()); sendlen = send(sockfd, sendbuf, sizeof(sendbuf), 0); if (sendlen < 0) { cout << "send fail" << endl; close(sockfd); exit(1); } if ((recvlen = recv(sockfd, recvbuf, sizeof(recvbuf), 0)) == -1) { cout << "recv fail" << endl; close(sockfd); exit(1); } else { cout << recvbuf << endl; } close(sockfd); return 0; }
2. バックエンド PHP テスト プログラム
<?php $input = file_get_contents("php://input"); var_dump($input); if ($_POST['user'] == "hello" && $_POST['password'] == "123456") { echo "welcome hello"; } else { echo "welcome guest"; } ?>
3. 実装効果
上の図では、クライアント C++ プログラムがバックエンド Nginx+PHP に送信された後、PHP を通じて POST データを取得します。以下の最初の 2 つの方法:
方法 1. 最も一般的な方法は次のとおりです: $_POST['fieldname'];
注: Content-Type: application/x-www-form-urlencoded によって送信されたデータのみを受信できます。
説明: フォームからのデータ POST です。
方法2、file_get_contents("php://input");
説明:
POSTの元データを読み込むことができます。
$HTTP_RAW_POST_DATA と比較して、メモリへの負担が少なく、特別な php.ini 設定は必要ありません。
php://input は enctype="multipart/form-data" では使用できません。
説明:
Content-Type が指定されていない POST データの場合、file_get_contents("php://input"); を使用して元のデータを取得できます。
実際、このメソッドは、PHP を使用して任意の POST データを受信するために使用できます。 Content-Type に関係なく、バイナリ ファイル ストリームを含めることもできます。
したがって、方法 2 を使用するのが最も安全な方法です。
方法 3、$GLOBALS['HTTP_RAW_POST_DATA'];
注:
常に元の POST データを含む $HTTP_RAW_POST_DATA 変数を生成します。
この変数は、認識できない MIME タイプのデータが見つかった場合にのみ生成されます。
$HTTP_RAW_POST_DATA は、enctype="multipart/form-data" フォーム データには使用できません。
投稿されたデータが PHP によって認識されない場合は、$GLOBALS['HTTP_RAW_POST_DATA'] を使用して受信できます。
text/xml や
説明:
$GLOBALS['HTTP_RAW_POST_DATA'] は、POST からの元のデータを保存します。
$_POST または $_REQUEST は、PHP によってフォーマットされたデータを key=>value の形式で保存します。
ただし、POST データを $GLOBALS['HTTP_RAW_POST_DATA'] に保存するかどうかは、Content-Type の設定によって決まります。つまり、データを POST するときは、Content-Type を明示的に指定する必要があります: application/x-www-form-urlencoded , POST データは $GLOBALS['HTTP_RAW_POST_DATA'] に保存されます。
ファイルをアップロードするには、POST enctype="multipart/form-data" を使用します。 PHP バックエンド コードの例:
<!DOCTYPE> <html> <body> <form method="post" action="" enctype="multipart/form-data"> <input type="file" name="file" id="file" /> <input type="submit" value="submit" /> </form> <?php echo "<pre class="brush:php;toolbar:false">"; print_r($_FILES); if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br>"; } else { $file = fopen($_FILES["file"]["tmp_name"], "r"); while (!feof($file)) { echo fgetc($file); } fclose($file); } ?> </body> </html>
関連する推奨事項:
PHP で APP インターフェイスを開発するときに注意する必要がある問題は何ですか?
以上がPHP バックグラウンドおよびモバイル APP インターフェイス開発サンプル コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。