峰峦@叠嶂 2025-02-18 10:52 采纳率: 98%
浏览 6
已结题

开发json报文接口,上传信息的问题

请教一下,目前接到上级文件,要求我们将生产信息(产品名称、规格、数量等),采用json报文的形式上传平台,并提供了接口调用,因为对此不熟悉,我们摸索着写了一个接口程序,请各位先看软件代码是否符合要求,另外运行时,程序总提示,需要用epplus8,或更高的版本等,但我用vS2022就支持epplus--8.0beta,具体要求和代码如下,请各位指导一下,多谢;

img

img

img

img

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OfficeOpenXml;
using OfficeOpenXml.FormulaParsing.Ranges;
using Newtonsoft.Json;

namespace Interfacetest
{
    public partial class Form1 : Form
    {
        private static readonly string ak = "your_ak";
        private static readonly string sk = "your_sk";
        private static readonly string excelFilePath = @"E:\上传文件夹\国产药信息上传-模板那说明.xlsx";
        private static readonly HttpClient _httpClient = new HttpClient();
        public Form1()
        {

            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        { }
        public static async Task Main(string[] args)
        {
            //// 初始化EPPlus
            //ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;

            // 从Excel文件中读取药品信息
            var productList = ReadProductInfoFromExcel(excelFilePath);

            //批量上传药品信息           
            await UploadProductsAsync(productList);

        }
        private static List<Dictionary<string, object>> ReadProductInfoFromExcel(string filePath)
        {
            var productList = new List<Dictionary<string, object>>();
            ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;

            using (var package = new ExcelPackage(new FileInfo(filePath)))
            {
                var worksheet = package.Workbook.Worksheets[0];
                int rowCount = worksheet.Dimension.Rows;

                for (int row = 2; row <= rowCount; row++)
                {
                    if (!int.TryParse(worksheet.Cells[row, 3].Text, out int quantity))
                    {
                        MessageBox.Show($"第 {row} 行数量格式错误");
                        continue;
                    }

                    var product = new Dictionary<string, object>
                    {
                        { "productName", worksheet.Cells[row, 1].Text },
                        { "specification", worksheet.Cells[row, 2].Text },
                        { "quantity", quantity },
                        { "traceCode", worksheet.Cells[row, 4].Text }
                    };
                    productList.Add(product);
                }
            }
            return productList;
        }
        private static async Task UploadProductsAsync(List<Dictionary<string, object>> products)
        {
            long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            var param = new { data = products };
            string sign = GenerateSignature(ak, timestamp.ToString(), sk, param);

            var payload = new
            {
                ak,
                timestamp,
                sign,
                param
            };

            var content = new StringContent(JsonConvert.SerializeObject(payload), Encoding.UTF8, "application/json");
            var response = await _httpClient.PostAsync("https://api.medicalinsurance.gov.cn/upload", content);

            if (!response.IsSuccessStatusCode)
            {
                string error = await response.Content.ReadAsStringAsync();
                throw new Exception($"API错误:{error}");
            }
        }     
        private static string GenerateSignature(string ak, string timestamp, string sk, object param)
        {
            string paramJson = JsonConvert.SerializeObject(param);
            string rawString = ak + timestamp + sk + paramJson;

            using (SHA256 sha256 = SHA256.Create())
            {
                byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(rawString));
                return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
            }
        }
        private static async Task SendRequestAsync(object payload)
        {
            using (var client = new HttpClient())
            {
                var content = new StringContent(JsonConvert.SerializeObject(payload), Encoding.UTF8, "application/json");
                var response = await client.PostAsync("https://api.medicalinsurance.gov.cn/upload", content);

                if (response.IsSuccessStatusCode)
                {
                    var responseString = await response.Content.ReadAsStringAsync();
                    Console.WriteLine("上传成功: " + responseString);
                }
                else
                {
                    Console.WriteLine("上传失败: " + response.StatusCode);
                }
            }
        }
        private async void button1_Click(object sender, EventArgs e)
        {
            try
            {
                var products = ReadProductInfoFromExcel(excelFilePath);
                await UploadProductsAsync(products);
                MessageBox.Show("上传成功!");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"错误:{ex.Message}");
            }
        }
    }    

}

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-02-18 10:52
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解答

    你想开发一个 JSON 报文接口,用于上传生产信息到平台上。你的问题是,你已经写了一个接口程序,但是你不确定是否符合要求。

    解答

    首先,需要了解平台提供的接口调用要求,包括请求方式、请求参数、响应格式等。然后,你可以使用 C# 语言来实现这个接口。

    以下是一个简单的示例代码,使用 System.Net.Http NuGet 包来发送 HTTP 请求:

    using System;
    using System.Net.Http;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace JsonReportInterface
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                // 设置请求参数
                string productName = "产品名称";
                string specification = "规格";
                int quantity = 100;
    
                // 创建 JSON 对象
                var json = new
                {
                    productName,
                    specification,
                    quantity
                };
    
                // 将 JSON 对象转换为字符串
                string jsonString = JsonConvert.SerializeObject(json);
    
                // 创建 HTTP 客户端
                var client = new HttpClient();
    
                // 设置请求头
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
                // 发送 POST 请求
                var response = await client.PostAsync("https://platform.com/api/upload", new StringContent(jsonString, Encoding.UTF8, "application/json"));
    
                // 检查响应结果
                if (response.IsSuccessStatusCode)
                {
                    Console.WriteLine("上传成功!");
                }
                else
                {
                    Console.WriteLine("上传失败!");
                }
            }
        }
    }
    

    这个示例代码使用 JsonConvert 类将 JSON 对象转换为字符串,然后使用 HttpClient 类发送 POST 请求到平台提供的接口上。

    请注意,这只是一个简单的示例代码,你需要根据平台提供的接口要求和你的实际需求来修改代码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月27日
  • 已采纳回答 3月19日
  • 创建了问题 2月18日