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;
    }
时间: 2024-08-04 22:16:22

C语言访问webservice小例子的相关文章

C语言:位操作小例子几则

首先,我将列举C语言中一些常用的与位操作相关的运算符 一.移位运算符 左移操作符<< 算术左移与逻辑左移都是左边移出一位,右边补0: 右移操作符>> 逻辑右移为右边移出一位左边最高位补0,而算术右移为右边移出一位,最高位补符号位. 二.位操作符 与 & 运算法则:见0为0,全1为1: 或 | 运算法则:见1为1,全0为0: 异或^ 运算法则:相同得0,相异为1: 接下来我将分享几个比较常用的对位进行操作的编程小例子 1.不使用临时变量实现数a和b的交换 #include&l

maven+springmvc+cxf 实现简单webservice小例子

1.首先你需要创建一个maven项目[当然是web项目] 2.pom.xml添加以下 <properties> <cxf.version>2.2.3</cxf.version></properties> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <v

C语言:递归小例子几则

递归定义: 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法. 递归条件: (1) 递归就是在过程或函数里调用自身: (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口. 利用递归可以使程序简化,减少代码的编写,下面请看例子. 1.取得十进制数的每一位并以字符的形式输出. #include<stdio.h> #include<stdlib.h> void binary_to_ascii(unsigned int value) { int num = v

C语言入门编程小例子

1.打印100~200之间的素数 #include<stdio.h> #include<math.h> int main() { inti,j,n=0; printf("100到200之间的素数有:\n"); for(i=100;i<=200;i++) { for(j=2;j<sqrt(i);j++) { if(i%j==0) break; else { if(j>sqrt(i)-1) { printf("%d",i); n

Go语言错误处理小例子

满屏的error处理会是个悲剧,也不利于对错误进行区分处理. 建议在项目中多用自定义错误,再对错误集中处理. package main //error处理方式演示 //author: Xiong Chuan Liang //date: 2015-2-26 import "fmt" import "errors" func main() { errType(test0()) errType(test1(" test1 ")) errType(tes

CXF webservice完整例子

Web Service技术应用广泛,可实现不同平台的数据交换,现做了一个CXF webservice小例子,供webservice初学者参考. 1.环境搭建 1.1  下载 Apache CXF  可以去官方下载 http://cxf.apache.org/ .也可点击http://pan.baidu.com/s/1jIPyOYU 我分享的云盘下载(apache-cxf-2.4.2).  解压文件 1.2  配置Apache CXF环境变量: 创建一个CXF_HOEM变量,值为CXF框架所在根目

Go语言使用Protocol Buffer的小例子

Protocol Buffer与Golang出自同门.Golang对其的支持包在https://github.com/golang/protobuf 下. 弄个小例子. 1. 创建proto文件usermsg.proto  package pfmsg; option java_package = "com.example.pfmsg"; option java_outer_classname = "UserMessage"; enum UserStatus { OF

五个小例子教你搞懂 JavaScript 作用域问题

众所周知,JavaScript 的作用域和其他传统语言(类C)差别比较大,掌握并熟练运用JavaScript 的作用域知识,不仅有利于我们阅读理解别人的代码,也有助于我们编写自己的可靠代码. 下面笔者将使用五个小例子来给大家分析下 JavaScript 的作用域要注意的问题. 感谢 例子的来源 (这5个例子我做错了2个 [嘿嘿,尽情鄙视吧],笔者就是要 死磕自己,奉献大家!) 先给出五个例子: 每个例子旁边都会给出答案的链接,如果你全部都正确了,你可以忽略这篇短文,并深深的鄙视下笔者. 例一:

Runtime的几个小例子(含Demo)

一.什么是runtime(也就是所谓的"运行时",因为是在运行时实现的.)           1.runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数);  [runtime运行系统]           2.实际上,平时我们编写的oc代码,底层都是基于runtime实现的;                             [OC语言的动态性]  运行时系统 (runtime system),对于C语言,函数的调用在编译的时候会决定调用哪个函数.对