中国军情
webservice调用(Linux下C++访问web—使用libcurl库调用http接口发送解析json数据)

一、背景

 现在的情形是远程服务端的接口参数和返回类型都是json的字符串。所以我们主要做的就是:连接远程url、找到接口,将基本类型的数据封装成json数据传入接口,然后获取返回值,并解析返回的json数据。

二、配置环境

安装curl库

2.解压:tar -xzvf curl-7.38.0.tar.gz

cd curl-7.38.0

sudo make

4.查看/usr/include目录下有没有curl文件夹,没有的话需要将解压包/curl-7.38.0/include中的curl拷贝过去

6.将路径加入系统查找路径中:

将目录/usr/local/lib写入该文件中

7 安装完成

1.下载JsonCpp:http://sourceforge.net/projects/jsoncpp/files/

3.解压scons-2.1.0.tar.gz:tar -zvxf scons-2.1.0.tar.gz

5.解压jsoncpp:tar -zvxf jsoncpp-src-0.5.0.tar.gz

7.将/jsoncpp-src-0.5.0/include/目录下的json文件夹拷贝到/usr/include/

三、编写代码

#include <stdio.h>

#include <unistd.h>

#include <curl/easy.h>

#include <json/json.h>

#include <iostream>

using namespace std;

size_t push_string(void* buffer, size_t size, size_t nmemb, void* stream)

string data((const char*)buffer, (size_t) size * nmemb);

return size*nmemb;

}

char *send_post(char *url, char *param)

std::stringstream res_str;

CURL *curl_handle = NULL;

CURLcode curl_res;

curl_res = curl_global_init(CURL_GLOBAL_ALL);

// printf("param is: %s\n", param);

if(curl_res == CURLE_OK)

curl_handle = curl_easy_init();

{

curl_easy_setopt(curl_handle, CURLOPT_POST, 1);

curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, param);

curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0);

curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, 10L);

curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &res_str);

curl_easy_setopt(curl_handle, CURLOPT_HEADER, 0L);

struct curl_slist *pList = NULL;

pList = curl_slist_append(pList,"Content-Type: application/json;charset=utf-8");

curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, pList);

if(curl_res != CURLE_OK)

printf("curl_easy_perform error, err_msg:[%ld]\n", curl_res);

curl_easy_cleanup(curl_handle);

}

else

printf("CURL ERROR : %s", curl_easy_strerror(curl_res));

}

std::string str_json = res_str.str();

str = (char *)malloc(200);

return str;

}

//解析json格式的返回值

void get_ret_info(char *res_str, char *flag, char *password, char *msg)

Json::Reader json_reader;

if(json_reader.parse(res_str, json_value))

std::string flag1 = json_value["id"].asString();

std::string msg1 = json_value["msg"].asString();

strcpy(flag, flag1.c_str());

strcpy(msg, msg1.c_str());

}

int main(int argc, char *argv[])

char url[100] = "http://172.16.10.138:8888/ServerX/doRecog"; //服务端url

char *res_str; //返回数据

//构造json格式的参数

item["username"] = Json::Value("test");

item["signdata"] = Json::Value("NULL");

item["imgtype"] = Json::Value("jpg");

std::string str = item.toStyledString();

strcpy(param, );

res_str = send_post(url, (char*)str.c_str());

char password[30] = {0};

get_ret_info(res_str, flag, password, msg);

三、编译

g++ -c getInfo.cpp -o getInfo.o

自动编译

CC=g++

CFLAGS=-Wall -DLDAP_DEPRECATED=1 -I ./include/

ARCH=$(shell getconf LONG_BIT)

ifeq ($(DBGEN),1)

endif

ifeq ($(ARCH),32)

BINDIR = ./

else

BINDIR = ./

endif

BINLIBS=-L $(LIBDIR) -lcurl -ljson

EXENAME1=getPasswd

EXEEXT=.exe

TARGETBIN1 = $(EXENAME1)$(DEBUG)$(EXEEXT)

BINOBJS1 = getPasswd.o

all: $(TARGETBIN1)

.cpp.o:

$(CC) $(CFLAGS) $(XFLAGS) -c $< -o $@

.cpp.b:

$(CC) $(CFLAGS) $(XFLAGS) -c $< -o $@

$(TARGETBIN1): $(BINOBJS1)

$(LD) -o $(BINDIR)$(TARGETBIN1) $(BINOBJS1) $(BINLIBS)

clean:

rm -f *.o $(BINDIR)$(TARGETBIN1)


顶一下()     踩一下()

热门推荐

发表评论
0评