linux C HTTP get 및 post 요청 실현
6439 단어 postgetLinux C 구현 http
/*File : http.h
*Auth : sjin
*Date : 20141206
*Mail : [email protected]
*/
#ifndef _MY_HTTP_H
#define _MY_HTTP_H
#define MY_HTTP_DEFAULT_PORT 80
char * http_get(const char *url);
char * http_post(const char *url,const char * post_str);
#endif
/*File : http.c
*Auth : sjin
*Date : 20141206
*Mail : [email protected]
*/
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include "http.h"
#define BUFFER_SIZE 1024
#define HTTP_POST "POST /%s HTTP/1.1\r
HOST: %s:%d\r
Accept: */*\r
"\
"Content-Type:application/x-www-form-urlencoded\r
Content-Length: %d\r
\r
%s"
#define HTTP_GET "GET /%s HTTP/1.1\r
HOST: %s:%d\r
Accept: */*\r
\r
"
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){
close(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 ip
ptr1 = 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
");
return NULL;
}
if(atoi(ptmp + 9)!=200){
printf("result:
%s
",lpbuf);
return NULL;
}
ptmp = (char*)strstr(lpbuf,"\r
\r
");
if(!ptmp){
printf("ptmp is NULL
");
return NULL;
}
response = (char *)malloc(strlen(ptmp)+1);
if(!response){
printf("malloc failed
");
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!
");
return NULL;
}
if(http_parse_url(url,host_addr,file,&port)){
printf("http_parse_url failed!
");
return NULL;
}
//printf("host_addr : %s\tfile:%s\t,%d
",host_addr,file,port);
socket_fd = http_tcpclient_create(host_addr,port);
if(socket_fd < 0){
printf("http_tcpclient_create failed
");
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..
");
return NULL;
}
//printf(" :
%s
",lpbuf);
/*it's time to recv from server*/
if(http_tcpclient_recv(socket_fd,lpbuf) <= 0){
printf("http_tcpclient_recv failed
");
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!
");
return NULL;
}
if(http_parse_url(url,host_addr,file,&port)){
printf("http_parse_url failed!
");
return NULL;
}
//printf("host_addr : %s\tfile:%s\t,%d
",host_addr,file,port);
socket_fd = http_tcpclient_create(host_addr,port);
if(socket_fd < 0){
printf("http_tcpclient_create failed
");
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..
");
return NULL;
}
// printf(" :
%s
",lpbuf);
if(http_tcpclient_recv(socket_fd,lpbuf) <= 0){
printf("http_tcpclient_recv failed
");
return NULL;
}
http_tcpclient_close(socket_fd);
return http_parse_result(lpbuf);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
프론트에서 Contentful으로의 POST 요청 방법이 문서를 보더라도 이해하기 어려웠기 때문에 요약JAMStack으로 서비스를 만들고 싶었고, 전부터 신경이 쓰인 헤드리스 CMS Contentful을 사용해 보았습니다. 브라우저에서 게시하는 것은 쉽지만 프런트에서 Contentful으로 POST 요청을하는 방법이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.