XML通过HTTP POST 请求发送到指定的 API 地址,进行数据回传

news/2025/1/10 10:42:56 标签: xml, 开发语言, 数据结构, c++, c#, c语言, python

代码结构说明
这段代码的主要功能是:

从指定文件夹中读取所有 XML 文件。

将每个 XML 文件的内容通过 HTTP POST 请求发送到指定的 API 地址。

处理服务器的响应,并记录每个文件的处理结果。

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Xml;

namespace EMS数据回传
{
    class Program
    {
        static void Main(string[] args)
        {
            // XML 文件夹路径
            string xmlFolderPath = @"Z:\toMesXml";

            // 服务器 API 地址
            string apiUrl = "服务器 API 地址";

            // 你的 AppId
            string appId = "你的 AppId";

            // 你的 AppKey
            string appKey = "你的 AppKey";

            // Topic 名称
            string topic = "Topic 名称";

            // 消息 Tag
            string tag = "消息 Tag";

            try
            {
                // 获取文件夹中的所有 XML 文件
                string[] xmlFiles = Directory.GetFiles(xmlFolderPath, "*.xml");

                // 如果文件夹中没有 XML 文件,输出提示并退出
                if (xmlFiles.Length == 0)
                {
                    Console.WriteLine("文件夹中没有 XML 文件。");
                    return;
                }

                // 遍历每个 XML 文件并发送
                foreach (string xmlFile in xmlFiles)
                {
                    try
                    {
                        // 输出当前正在处理的文件
                        Console.WriteLine(string.Format("正在处理文件: {0}", xmlFile));

                        // 1. 读取 XML 文件内容
                        string xmlContent = ReadXmlFile(xmlFile);

                        // 2. 发送 HTTP 请求
                        string response = SendHttpRequest(apiUrl, appId, appKey, topic, tag, xmlContent);

                        // 3. 处理响应,输出发送成功的信息
                        Console.WriteLine(string.Format("文件 {0} 发送成功,服务器响应: {1}", xmlFile, response));
                    }
                    catch (XmlException ex)
                    {
                        // 捕获 XML 格式错误
                        Console.WriteLine(string.Format("文件 {0} 格式错误: {1}", xmlFile, ex.Message));
                    }
                    catch (IOException ex)
                    {
                        // 捕获文件读取失败错误
                        Console.WriteLine(string.Format("文件 {0} 读取失败: {1}", xmlFile, ex.Message));
                    }
                    catch (WebException ex)
                    {
                        // 捕获 HTTP 请求失败错误
                        Console.WriteLine(string.Format("文件 {0} 发送失败,HTTP 错误: {1}", xmlFile, ex.Message));
                    }
                    catch (Exception ex)
                    {
                        // 捕获其他未知错误
                        Console.WriteLine(string.Format("文件 {0} 发生未知错误: {1}", xmlFile, ex.Message));
                    }
                }
            }
            catch (Exception ex)
            {
                // 捕获全局错误
                Console.WriteLine("发生错误: " + ex.Message);
            }
        }

        // 读取 XML 文件内容
        static string ReadXmlFile(string filePath)
        {
            // 检查文件是否存在,如果不存在则抛出异常
            if (!File.Exists(filePath))
            {
                throw new FileNotFoundException("XML 文件未找到: " + filePath);
            }

            // 使用 StreamReader 指定编码读取文件
            using (StreamReader reader = new StreamReader(filePath, Encoding.GetEncoding("GB2312"))) // 根据文件编码调整
            {
                // 读取文件的全部内容并返回
                string xmlContent = reader.ReadToEnd();
                return xmlContent;
            }
        }

        // 发送 HTTP 请求
        static string SendHttpRequest(string url, string appId, string appKey, string topic, string tag, string xmlContent)
        {
            // 创建 HTTP 请求
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            // 设置请求方法为 POST
            request.Method = "POST";

            // 设置请求内容类型为 XML
            request.ContentType = "application/xml";

            // 添加请求头
            request.Headers.Add("X-HW-ID", appId);       // AppId
            request.Headers.Add("X-HW-APPKEY", appKey);  // AppKey
            request.Headers.Add("MsgTopic", topic);      // Topic
            request.Headers.Add("MsgTag", tag);          // Tag

            // 将 XML 内容转换为字节数组
            byte[] data = Encoding.UTF8.GetBytes(xmlContent);

            // 设置请求内容的长度
            request.ContentLength = data.Length;

            // 将 XML 内容写入请求体
            using (Stream requestStream = request.GetRequestStream())
            {
                requestStream.Write(data, 0, data.Length);
            }

            // 获取服务器响应
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            using (Stream responseStream = response.GetResponseStream())
            using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))
            {
                // 读取服务器响应的内容并返回
                return reader.ReadToEnd();
            }
        }
    }
}

代码功能详解

  1. 文件夹路径和 API 配置

    • xmlFolderPath:指定存放 XML 文件的文件夹路径。

    • apiUrl:华为服务器的 API 地址。

    • appId 和 appKey:用于身份验证的 AppId 和 AppKey。

    • topic 和 tag:消息的主题和标签。

  2. 读取文件夹中的 XML 文件

    • 使用 Directory.GetFiles 方法获取文件夹中所有 .xml 文件。

    • 如果文件夹中没有文件,输出提示并退出程序。

  3. 遍历并处理每个 XML 文件

    • 使用 foreach 循环遍历每个文件。

    • 调用 ReadXmlFile 方法读取文件内容。

    • 调用 SendHttpRequest 方法将文件内容发送到服务器。

    • 捕获并处理可能发生的异常(如文件格式错误、读取失败、HTTP 请求失败等)。

  4. 读取 XML 文件内容

    • 使用 StreamReader 读取文件内容,并指定文件编码为 GB2312

    • 如果文件不存在,抛出 FileNotFoundException 异常。

  5. 发送 HTTP 请求

    • 使用 HttpWebRequest 创建 HTTP POST 请求。

    • 设置请求头(AppId、AppKey、Topic、Tag)。

    • 将 XML 内容写入请求体。

    • 获取服务器响应并返回响应内容。

  6. 异常处理

    • 对文件读取、XML 解析、HTTP 请求等操作进行异常捕获,确保程序健壮性。


代码运行流程

  1. 程序启动后,检查指定文件夹中是否存在 XML 文件。

  2. 如果存在文件,逐个读取文件内容并发送到服务器。

  3. 每次发送后,输出服务器的响应内容。

  4. 如果发生错误,输出错误信息并继续处理下一个文件。


注意事项

  1. 文件编码

    • 代码中假设 XML 文件的编码是 GB2312,如果文件编码不同,需要调整 StreamReader 的编码参数。

  2. HTTP 请求超时

    • 如果服务器响应较慢,可能需要设置 HttpWebRequest.Timeout 属性,避免请求长时间挂起。

  3. 异常处理

    • 代码中对常见异常进行了捕获,但可以根据实际需求进一步细化异常处理逻辑。


如果有其他问题,欢迎继续讨论!


http://www.niftyadmin.cn/n/5818535.html

相关文章

计算机网络 笔记 第一章

计算机网络组成和功能 组成: 从组成部分来看计算机网络: 由硬件,软件,协议组成 硬件:主机(端系统) ,通信设备(转发设备)和通信通路 软件:各种软件应用 协议:网络中通信的规则,由硬件和软件共同实现. 如:网络适配器(网卡)软件实现网络通信协议 从工作方式来看计算机网络: …

Three.js 扩展与插件:增强3D开发的利器

文章目录 前言一、物理引擎集成(Physics Engines)二、动画工具(Animation Tools)三、加载器(Loaders)四、后处理效果(Post-processing Effects)五、用户交互(User Intera…

工作中Excel技巧整理

系列文章目录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、整列加一个数二、数据处理方法1.剔除异常值,即最大值和最小值剔除。 三、去掉整列某一个字符串 前言 整理常见的工作…

Gartner 2024「API管理市场」解读:谁是未来的领导者?

随着数字化转型的加速,API(应用程序接口)已经成为连接企业内外部系统、服务和数据的关键桥梁。选择合适的API管理平台对于现代化架构至关重要。 本文基于Gartner发布的《Magic Quadrant for API Management》报告,带您深入了解20…

Java全栈项目-校园物业服务平台

项目简介 本项目是一个基于Spring Boot Vue.js的校园物业服务管理平台,旨在提供便捷的校园物业服务预约和管理功能。 技术栈 后端 Spring Boot 2.7.xSpring SecurityMyBatis-PlusMySQL 8.0RedisJWT 前端 Vue.js 3Element PlusAxiosVitePinia 核心功能 用户管…

编程范式、设计模式和算法之间的关系

编程范式、设计模式和算法是软件开发中的三个重要概念,它们各自关注不同的方面,但又相互关联,共同影响着程序的设计和实现。以下是对三者关系的解析: ### 编程范式(Programming Paradigms) 编程范式定义了…

后端:Spring(IOC、AOP)

文章目录 1. Spring2. IOC 控制反转2-1. 通过配置文件定义Bean2-1-1. 通过set方法来注入Bean2-1-2. 通过构造方法来注入Bean2-1-3. 自动装配2-1-4. 集合注入2-1-5. 数据源对象管理(第三方Bean)2-1-6. 在xml配置文件中加载properties文件的数据(context命名空间)2-1-7. 加载容器…

Sentinel服务保护 + Seata分布式事务

服务保护 【雪崩问题】微服务调用链路中某个服务,引起整个链路中所有微服务都不可用。 【原因】: 微服务相互调用,服务提供者出现故障。服务调用这没有做好异常处理,导致自身故障。调用链中所有服务级联失败,导致整个…