Cet article partage principalement avec vous l'exemple de code de développement du backend PHP et de l'interface d'application mobile, dans l'espoir d'aider tout le monde.
1. Interface du programme d'application mobile (client)
Ici est utilisé sur. PC Utiliser le programme C++ pour simuler le POST des données du protocole HTTP
#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. Programme de test PHP en arrière-plan
<?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. Effet d'implémentation
Dans l'image ci-dessus, le programme client C++, une fois les données POST envoyées en arrière-plan Nginx+PHP, PHP obtient les données POST via les deux premières méthodes suivantes :
Méthode 1. La méthode la plus courante est : $_POST['fieldname'];
Remarque : seules les données soumises par Content-Type : application/x-www-form-urlencoded peuvent être reçues.
Explication : Il s'agit des données POST du formulaire.
Méthode 2, file_get_contents("php://input");
Description :
Permet de lire les données originales du POST.
Il met moins de pression sur la mémoire que $HTTP_RAW_POST_DATA et ne nécessite aucun paramètre php.ini spécial.
php://input ne peut pas être utilisé avec enctype="multipart/form-data".
Explication :
Pour les données POST sans Content-Type spécifié, vous pouvez utiliser file_get_contents("php://input");
En fait, cette méthode peut être utilisée pour recevoir n'importe quelle donnée POST en utilisant PHP. Quel que soit le type de contenu, l'inclusion de flux de fichiers binaires est également acceptable.
La méthode 2 est donc la méthode la plus sûre.
Méthode 3, $GLOBALS['HTTP_RAW_POST_DATA'];
Explication :
Générez toujours la variable $HTTP_RAW_POST_DATA contenant les données POST d'origine.
Cette variable n'est générée que lorsque des données avec des types MIME non reconnus sont rencontrées.
$HTTP_RAW_POST_DATA n'est pas disponible pour les données du formulaire enctype="multipart/form-data"
Si les données publiées ne sont pas reconnues par PHP, vous pouvez utiliser $GLOBALS['HTTP_RAW_POST_DATA'] pour les recevoir,
comme du texte /xml ou du savon, etc.
Explication :
$GLOBALS['HTTP_RAW_POST_DATA'] stocke les données originales du POST.
$_POST ou $_REQUEST stocke les données formatées par PHP sous la forme clé=>valeur.
Mais le fait que les données POST soient enregistrées dans $GLOBALS['HTTP_RAW_POST_DATA'] dépend du paramètre Content-Type, c'est-à-dire que lors du POSTing des données, Content-Type doit être explicitement spécifié : application/ x-www -form-urlencoded, les données POST seront stockées dans $GLOBALS['HTTP_RAW_POST_DATA'].
Pour télécharger des fichiers, utilisez POST enctype="multipart/form-data". Exemple de code backend 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>
Recommandations associées :
Écriture d'application dans l'interface Laravel (API)
Discussion sur les problèmes de sécurité de l'écriture d'interface d'application PHP
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!