libcurl通过HTTPS方式提交XML并解析响应信息

2024-03-12 00:08

本文主要是介绍libcurl通过HTTPS方式提交XML并解析响应信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

不用太多解释,需要的自然有用。稍微有一丝难度的是某个地方用到回调函数,关于回调函数的概念,请百度。

程序中用到XPath,不了解的可以看这里:
http://www.w3school.com.cn/xpath/index.asp

还有这里:
http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html

#include <stdio.h> #include <string.h> #include <curl/curl.h> #include <time.h> #include <libxml/parser.h> #include <libxml/xmlmemory.h> #include <libxml/xpath.h> #include <libxml/xpathInternals.h> static void set_prop(xmlXPathContextPtr context, const xmlChar *xpath, const xmlChar *name, const xmlChar *value){ xmlXPathObjectPtr result = xmlXPathEvalExpression(xpath, context); if (result) { xmlSetProp(result->nodesetval->nodeTab[0], (const xmlChar *) name, (const xmlChar *) value); xmlXPathFreeObject (result); } } static void set_value(xmlXPathContextPtr context, const xmlChar *xpath, const xmlChar *value){ xmlXPathObjectPtr result = xmlXPathEvalExpression(xpath, context); if ( result ) { xmlNodeSetPtr nodeset = result->nodesetval; xmlNodeSetContent(nodeset->nodeTab[0], value); xmlXPathFreeObject(result); } } static void get_request( char *buffer, int *len, const char *orderno, const char *username, const char *password, const char *imsi, const char *action, const char *serivcename) { xmlChar *buff; xmlDocPtr doc; if ( strcmp(action, "A") == 0 ) { doc = xmlParseFile("mobb_activate.xml"); } else if ( strcmp(action, "D") == 0 ) { doc = xmlParseFile("mobb_cancel.xml"); } else { doc = xmlParseFile("mobb_status.xml"); } if ( doc == NULL ) { printf("xmlParseFile failed\n"); return; } xmlXPathContextPtr context = xmlXPathNewContext(doc); if ( context == NULL ) { printf("xmlXPathNewContext failed\n"); return; } time_t now; struct tm ts; char timestamp[80]; time(&now); ts = *localtime(&now); strftime(timestamp, sizeof(timestamp), "%Y-%m-%dT%H:%M:%S+08:00", &ts); set_prop(context, (const xmlChar *)"//ProvisioningRequest", (const xmlChar *) "TransactionId", (const xmlChar *) orderno); set_value(context, (const xmlChar *)"//Login", (const xmlChar *) username); set_value(context, (const xmlChar *)"//Password", (const xmlChar *) password); set_value(context, (const xmlChar *)"//TimeStamp", (const xmlChar *) timestamp); set_value(context, (const xmlChar *)"//ProvisioningDataItem[@name='IMSI']", (const xmlChar *) imsi); if ( strcmp(action, "A") == 0 ) { set_value(context, (const xmlChar *)"//ProvisioningDataItem[@name='ServiceName']", (const xmlChar *) serivcename); } xmlDocDumpMemory(doc, &buff, len); strcpy(buffer, (char *) buff); printf("%s\n", buffer); xmlFree(buff); xmlXPathFreeContext(context); xmlFreeDoc(doc); xmlCleanupParser(); } static size_t get_response(void *ptr, size_t size, size_t nmemb, void *stream) { char resp[2048]; strcpy(resp, (char *) ptr); if ( strncmp(resp, "<?xml", 5) == 0 ) { printf("%s\n", resp); xmlDocPtr doc = xmlParseMemory(resp, strlen(resp)); xmlXPathContextPtr context = xmlXPathNewContext(doc); xmlXPathObjectPtr result = xmlXPathEvalExpression((const xmlChar *) "//ErrorCode", context); if ( result ) { xmlNodeSetPtr nodeset = result->nodesetval; printf("MD_RT_CODE: %s\n", xmlNodeGetContent(nodeset->nodeTab[0])); xmlXPathFreeObject(result); } result = xmlXPathEvalExpression((const xmlChar *) "//ErrorDescription", context); if ( result ) { xmlNodeSetPtr nodeset = result->nodesetval; printf("MD_RT_MESSAGE: %s\n", xmlNodeGetContent(nodeset->nodeTab[0])); xmlXPathFreeObject(result); } xmlXPathFreeContext(context); xmlFreeDoc(doc); } return strlen(resp); } int main(int argc, char **argv) { if ( argc < 7 || argc > 8 ) { printf("Usage: BlackBerryProv endpoint username password orderno imsi action [servicename]\n"); exit(-1); } const char *action = argv[6]; if ( strcmp(action, "A") != 0 && strcmp(action, "D") != 0 && strcmp(action, "S") != 0 ) { printf("action must be A (Activation), D (De-activation) or S (Status)\n"); exit(-1); } if ( strcmp(action, "A") == 0 && argc == 7 ) { printf("service name is needed in activation\n"); exit(-1); } const char *endpoint = argv[1]; const char *username = argv[2]; const char *password = argv[3]; const char *orderno = argv[4]; const char *imsi = argv[5]; const char *servicename = argv[7]; char buffer[2048]; int len = 0; get_request(buffer, &len, orderno, username, password, imsi, action, servicename); struct curl_slist *headers = NULL; CURL *curl = curl_easy_init(); if ( curl ) { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); //curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); curl_easy_setopt(curl, CURLOPT_URL, endpoint); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, buffer); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(buffer)); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_HEADER, 1); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); if ( strcmp(action, "S") != 0 ) { curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, get_response); } curl_easy_perform(curl); /* always cleanup */ curl_easy_cleanup(curl); curl_slist_free_all(headers); } return 0; }

这篇关于libcurl通过HTTPS方式提交XML并解析响应信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/799519

相关文章

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2