linux C 实现HTTP get 及post 请求
生活随笔
收集整理的這篇文章主要介紹了
linux C 实现HTTP get 及post 请求
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考文章:linux C 實現HTTP get 及post 請求
C語言實現HTTP的GET和POST請求
C語言實現HTTP的GET和POST請求例程參考
1.main.c文件
#include <stdio.h> #include "http_tool.h"int main() {printf("Hello, World!\n");char *url2 = "http://localhost:12600/getUserList";char *url = http_get(url2);printf("%s", url);return 0; }2.http_tool.h文件
/* * Created by fiend on 2021/7/13. */#ifndef C_HTTPCLIENT3_HTTP_TOOL3_H #define C_HTTPCLIENT3_HTTP_TOOL3_H#endif //C_HTTPCLIENT3_HTTP_TOOL3_H// 參考: https://blog.csdn.net/sjin_1314/article/details/41776679 #ifndef _MY_HTTP_H #define _MY_HTTP_H#define MY_HTTP_DEFAULT_PORT 80char *http_get(const char *url);char *http_post(const char *url, const char *post_str);#endif3.http_tool.c文件
#include "http_tool.h"#include <stdio.h> #include <stdlib.h> #include <arpa/inet.h> #include <netdb.h>#include <string.h>#define BUFFER_SIZE 1024 #define HTTP_POST "POST /%s HTTP/1.1\r\nHOST: %s:%d\r\nAccept: */*\r\n"\"Content-Type:application/x-www-form-urlencoded\r\nContent-Length: %d\r\n\r\n%s" #define HTTP_GET "GET /%s HTTP/1.1\r\nHOST: %s:%d\r\nAccept: */*\r\n\r\n"static int http_tcpclient_create(const char *host, int port) {struct hostent *he;struct sockaddr_in server_addr;int socket_fd;if ((he = gethostbyname(host)) == NULL) {return -1;}server_addr.sin_family = AF_INET;server_addr.sin_port = htons(port);server_addr.sin_addr = *((struct in_addr *) he->h_addr);if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {return -1;}if (connect(socket_fd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr)) == -1) {return -1;}return socket_fd; }static void http_tcpclient_close(int socket) {// lpfclose(socket); }static int http_parse_url(const char *url, char *host, char *file, int *port) {char *ptr1, *ptr2;int len = 0;if (!url || !host || !file || !port) {return -1;}ptr1 = (char *) url;if (!strncmp(ptr1, "http://", strlen("http://"))) {ptr1 += strlen("http://");} else {return -1;}ptr2 = strchr(ptr1, '/');if (ptr2) {len = strlen(ptr1) - strlen(ptr2);memcpy(host, ptr1, len);host[len] = '\0';if (*(ptr2 + 1)) {memcpy(file, ptr2 + 1, strlen(ptr2) - 1);file[strlen(ptr2) - 1] = '\0';}} else {memcpy(host, ptr1, strlen(ptr1));host[strlen(ptr1)] = '\0';}//get host and ipptr1 = strchr(host, ':');if (ptr1) {*ptr1++ = '\0';*port = atoi(ptr1);} else {*port = MY_HTTP_DEFAULT_PORT;}return 0; }static int http_tcpclient_recv(int socket, char *lpbuff) {int recvnum = 0;recvnum = recv(socket, lpbuff, BUFFER_SIZE * 4, 0);return recvnum; }static int http_tcpclient_send(int socket, char *buff, int size) {int sent = 0, tmpres = 0;while (sent < size) {tmpres = send(socket, buff + sent, size - sent, 0);if (tmpres == -1) {return -1;}sent += tmpres;}return sent; }static char *http_parse_result(const char *lpbuf) {char *ptmp = NULL;char *response = NULL;ptmp = (char *) strstr(lpbuf, "HTTP/1.1");if (!ptmp) {printf("http/1.1 not faind\n");return NULL;}if (atoi(ptmp + 9) != 200) {printf("result:\n%s\n", lpbuf);return NULL;}ptmp = (char *) strstr(lpbuf, "\r\n\r\n");if (!ptmp) {printf("ptmp is NULL\n");return NULL;}response = (char *) malloc(strlen(ptmp) + 1);if (!response) {printf("malloc failed \n");return NULL;}strcpy(response, ptmp + 4);return response; }char *http_post(const char *url, const char *post_str) {char post[BUFFER_SIZE] = {'\0'};int socket_fd = -1;char lpbuf[BUFFER_SIZE * 4] = {'\0'};char *ptmp;char host_addr[BUFFER_SIZE] = {'\0'};char file[BUFFER_SIZE] = {'\0'};int port = 0;int len = 0;char *response = NULL;if (!url || !post_str) {printf(" failed!\n");return NULL;}if (http_parse_url(url, host_addr, file, &port)) {printf("http_parse_url failed!\n");return NULL;}//printf("host_addr : %s\tfile:%s\t,%d\n",host_addr,file,port);socket_fd = http_tcpclient_create(host_addr, port);if (socket_fd < 0) {printf("http_tcpclient_create failed\n");return NULL;}sprintf(lpbuf, HTTP_POST, file, host_addr, port, strlen(post_str), post_str);if (http_tcpclient_send(socket_fd, lpbuf, strlen(lpbuf)) < 0) {printf("http_tcpclient_send failed..\n");return NULL;}//printf("發送請求:\n%s\n",lpbuf);/*it's time to recv from server*/if (http_tcpclient_recv(socket_fd, lpbuf) <= 0) {printf("http_tcpclient_recv failed\n");return NULL;}http_tcpclient_close(socket_fd);return http_parse_result(lpbuf); }char *http_get(const char *url) {char post[BUFFER_SIZE] = {'\0'};int socket_fd = -1;char lpbuf[BUFFER_SIZE * 4] = {'\0'};char *ptmp;char host_addr[BUFFER_SIZE] = {'\0'};char file[BUFFER_SIZE] = {'\0'};int port = 0;int len = 0;if (!url) {printf(" failed!\n");return NULL;}if (http_parse_url(url, host_addr, file, &port)) {printf("http_parse_url failed!\n");return NULL;}//printf("host_addr : %s\tfile:%s\t,%d\n",host_addr,file,port);socket_fd = http_tcpclient_create(host_addr, port);if (socket_fd < 0) {printf("http_tcpclient_create failed\n");return NULL;}sprintf(lpbuf, HTTP_GET, file, host_addr, port);if (http_tcpclient_send(socket_fd, lpbuf, strlen(lpbuf)) < 0) {printf("http_tcpclient_send failed..\n");return NULL;}// printf("發送請求:\n%s\n",lpbuf);if (http_tcpclient_recv(socket_fd, lpbuf) <= 0) {printf("http_tcpclient_recv failed\n");return NULL;}http_tcpclient_close(socket_fd);return http_parse_result(lpbuf); }總結
以上是生活随笔為你收集整理的linux C 实现HTTP get 及post 请求的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iptv管理系统php制作,云水日记-双
- 下一篇: eeglab新建电极位置并保存为文件