本文主要和大家分享PHP後台與手機APP介面開發執行個體代碼,希望能協助到大家
一、手機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 1024int 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;}
二、後台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";}?>
三、實現效果
中,用戶端C++程式,POST資料給後台Nginx+PHP後,PHP通過以下前兩種方式擷取POST的資料:
方法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,包括二進位檔案流也可以。
所以用方法二是最保險的方法。
方法3、$GLOBALS['HTTP_RAW_POST_DATA'];
說明:
總是產生 $HTTP_RAW_POST_DATA 變數包含有原始的 POST 資料。
此變數僅在碰到未識別 MIME 類型的資料時產生。
$HTTP_RAW_POST_DATA 對於 enctype="multipart/form-data" 表單資料不可用
如果post過來的資料不是PHP能夠識別的,可以用 $GLOBALS['HTTP_RAW_POST_DATA']來接收,
比如 text/xml 或者 soap 等等
解釋:
$GLOBALS['HTTP_RAW_POST_DATA']存放的是POST過來的未經處理資料。
$_POST或$_REQUEST存放的是 PHP以key=>value的形式格式化以後的資料。
但$GLOBALS['HTTP_RAW_POST_DATA']中是否儲存POST過來的資料取決於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><?phpecho "<pre>";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>