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

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分