程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言訪問webservice小例子,c語言webservice

C語言訪問webservice小例子,c語言webservice

編輯:關於C語言

C語言訪問webservice小例子,c語言webservice


  近期做的一個項目中,需要訪問webservice獲取一些json格式的數據。返回的頁面內容只是json格式的數據,並不像實際頁面那麼復雜。所以不想再引入工具庫,直接用socket簡單實現了。

  以下代碼並不是實際項目源碼,是我摘取出來整理成的一個小例子分享給大家。代碼本身很容易理解,但是需要一些socket編程和http協議基礎。

    #include <stdio.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <errno.h>
    #include <time.h>

    int main()
    {
        int sockfd = 0;
        struct sockaddr_in ser_addr;
        char url[1024] = {0};          //請求緩沖區
        char recvbuff[4096] = {0};     //接收緩沖區
        char *data = NULL;              
        struct timeval time = {5,0};
        int ret = 0;

        //填充webservice主機信息
        memset(&ser_addr, 0, sizeof(ser_addr));
        ser_addr.sin_family = AF_INET;
        ser_addr.sin_port = htons(80);
        ret = inet_pton(AF_INET, "127.0.0.1", &ser_addr.sin_addr.s_addr);
        if (ret < 0)
        {
            perror("ERROR");
            return -1;
        }

        if (ret == 0)
        {
            puts("ERROR:arguments error");
            return -1;
        }

        //創建socket
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if(sockfd < 0)
        {
            perror("ERROR");
            return -1;
        }

        //設置阻塞時間為5s
        ret = setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&time, sizeof(time));
        if (ret < 0)
        {
            perror("ERROR");
            goto end;
        }

        //連接webservice
        ret = connect(sockfd, (struct sockaddr *)&ser_addr, sizeof(struct sockaddr));
        if(ret != 0)
        {
            perror("ERROR");
            goto end;
        }

        //填充請求url 請求頭部其他屬性自行添加。每行以換行加回車結束
        snprintf(url, sizeof(url), "GET /test HTTP/1.0\r\n\r\n");

        //發起http請求
        ret = send(sockfd, url, strlen(url), 0);
        if (ret < 0)
        {
            perror("ERROR");
            goto end;
        }
        puts("send success");

        //頁面返回
        ret = recv(sockfd, recvbuff, sizeof(recvbuff), 0);
        if (ret < 0)
        {
            perror("ERROR");
            goto end;
        }
        puts("recv success");

        //解析返回頁面,將data指針指向數據主體
        data = strstr(recvbuff,"\r\n\r\n");
        data += 4;

        //打印頁面
        if (data != NULL)
        {
            puts(data);
        }
    end:
        close(sockfd);
        return 0;
    }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved