發送http請求的C++代碼實現

bb225 9年前發布 | 5K 次閱讀 C/C++

    #include <arpa/inet.h>

#include <assert.h>  
#include <errno.h>  
#include <netinet/in.h>  
#include <signal.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <sys/wait.h>  
#include <netdb.h>  
#include <unistd.h>  

#define SA      struct sockaddr  
#define MAXLINE 4096  
#define MAXSUB  2000  
#define MAXPARAM 2048  

#define LISTENQ         1024  

extern int h_errno;  

int sockfd;  
char *hname = "yunpian.com";  
char *send_sms_json = "/v1/sms/send.json";  
char *get_user_json = "/v1/user/get.json";  

/** 
 * 發http post請求 
 */  
ssize_t http_post(char *page, char *poststr)  
{  
    char sendline[MAXLINE + 1], recvline[MAXLINE + 1];  
    ssize_t n;  
    snprintf(sendline, MAXSUB,  
             "POST %s HTTP/1.0\r\n"  
             "Host: %s\r\n"  
             "Content-type: application/x-www-form-urlencoded\r\n"  
             "Content-length: %zu\r\n\r\n"  
             "%s", page, hname, strlen(poststr), poststr);  

    write(sockfd, sendline, strlen(sendline));  
    while ((n = read(sockfd, recvline, MAXLINE)) > 0) {  
        recvline[n] = '\0';  
        printf("%s", recvline);  
    }  
    return n;  
}  

/** 
 * 查賬戶信息 
 */  
ssize_t get_user(char *apikey)  
{  
    char params[MAXPARAM + 1];  
    char *cp = params;  
    sprintf(cp,"apikey=%s", apikey);  
    return http_post(get_user_json, cp);  
}  

/** 
 * 使用通用接口發短信 
 */  
ssize_t send_sms(char *apikey, char *mobile, char *text)  
{  
    char params[MAXPARAM + 1];  
    char *cp = params;  
    sprintf(cp,"apikey=%s&mobile=%s&text=%s", apikey, mobile, text);  
    return http_post(send_sms_json, cp);  
}  

int main(void)  
{  
    struct sockaddr_in servaddr;  
    char **pptr;  
    char str[50];  
    struct hostent *hptr;  
    if ((hptr = gethostbyname(hname)) == NULL) {  
        fprintf(stderr, "通過域名獲取IP失敗: %s: %s",  
                hname, hstrerror(h_errno));  
        exit(1);  
    }  
    printf("域名: %s\n", hptr->h_name);  
    if (hptr->h_addrtype == AF_INET  
        && (pptr = hptr->h_addr_list) != NULL) {  
        printf("IP: %s\n",  
               inet_ntop(hptr->h_addrtype, *pptr, str,  
                         sizeof(str)));  
    } else {  
        fprintf(stderr, "Error call inet_ntop \n");  
        exit(1);  
    }  

    //建立socket連接  
    sockfd = socket(AF_INET, SOCK_STREAM, 0);  
    bzero(&servaddr, sizeof(servaddr));  
    servaddr.sin_family = AF_INET;  
    servaddr.sin_port = htons(80);  
    inet_pton(AF_INET, str, &servaddr.sin_addr);  

    connect(sockfd, (SA *) & servaddr, sizeof(servaddr));  

    //修改為您的apikey  
    char *apikey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";  
    //修改為您要發送的手機號  
    char *mobile = "188xxxxxxxx";  
    //設置您要發送的內容  
    char *text = "您的驗證碼是1234";  

    /**************** 查賬戶信息調用示例 *****************/  
    get_user(apikey);  

    /**************** 使用通用接口發短信 *****************/  
    //send_sms(apikey, mobile, text);  

    close(sockfd);  
    exit(0);  
}             </pre> 


 本文由用戶 bb225 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!