c# 后台post调用webapi站点

本文介绍了如何使用C#在后台通过POST方式调用WebAPI接口。关键在于添加[FromBody]属性来接收参数,例如在生成报告的API中,可以定义如下:[HttpPost] public string GenerateReport([FromBody]string name) {...}
   这几天做一个项目,需要把一部分方法单独放在webspi站点上,然后在后台程序中调用站点上的这些方法,在这期间遇到一个问题,httpGet方法是可以正常使用的,httpPost方法不能直接传多个参数过去,直接就报404了。
   后来网上搜到要用[FromBody] 这个属性,就是webapi上的方法参数那里,你可以把这几个参数封装成一个小类,然后用实体类的对象接收c#后台回传的几个参数:
   c# 后台代码:
   [WebMethod]
   public static JsonResult GenerateReport(int campaignID, string campaignName, int campaignType)
    {
        string ss = HttpPost("http://localhost:7766/api/UserInfo/GenerateReport", "{userID:\"" + SlSessionState.CurrentUser.Userid + "\",campaignID:" + campaignID + ",campaignName:\""+ campaignName + "\",campaignType:"+ campaignType + "}");
        var data = new
        {
            StatuCode = "OK",
            Result = "Generate Success"
        };
        JsonResult result = new JsonResult(data);
        return result;
    }
    public static string HttpPost(string url, string body)
    {
        //ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
        Encoding encoding = 
<think>根据用户的问题,用户想了解如何使用C#通过POST方式调用MES WEB API。结合提供的引用资料,我们可以总结出以下方法: 1. **使用HttpClient类**:这是.NET框架中用于HTTP通信的核心类。 2. **使用RestSharp库**:一个流行的第三方HTTP客户端库,简化了HTTP请求的构建和发送。 3. **使用WebClient类**:.NET中较老的类,也可用于HTTP通信(但未在引用中直接出现,可作为备选)。 我将重点根据引用资料中提供的方法进行说明,并给出示例代码。 ### 方法一:使用HttpClient(引用[2]中的方法) 这是最常用的方法,使用.NET内置的HttpClient类发送POST请求。 步骤: 1. 创建HttpClient实例。 2. 准备请求地址(URL)和参数(通常以字典形式组织)。 3. 将参数编码并放入HttpContent(如FormUrlEncodedContent)。 4. 发送请求并获取响应。 示例代码: ```csharp using System.Net.Http; using System.Collections.Generic; using System.Threading.Tasks; public class MesClient { public async Task<string> PostToMesAsync(string url, Dictionary<string, string> parameters) { using (HttpClient client = new HttpClient()) { // 构造表单数据 var content = new FormUrlEncodedContent(parameters); // 发送POST请求 HttpResponseMessage response = await client.PostAsync(url, content); // 确保成功响应 if (response.IsSuccessStatusCode) { return await response.Content.ReadAsStringAsync(); } else { return $"请求失败,状态码:{response.StatusCode}"; } } } } ``` 调用示例: ```csharp Dictionary<string, string> data = new Dictionary<string, string> { { "sWo", "1025" } }; MesClient client = new MesClient(); string result = await client.PostToMesAsync("http://10.1.1.1/api/MES/API_GetLaserAOIParm", data); ``` ### 方法二:使用RestSharp库(引用[3]和[4]) RestSharp是一个强大的HTTP客户端库,可以简化请求的构建和响应处理。 步骤: 1. 安装RestSharp Nuget包。 2. 创建RestClient和RestRequest对象。 3. 设置请求方法为POST。 4. 添加请求头(如Authorization)和参数(包括JSON body)。 5. 执行请求并处理响应。 示例代码(参考引用[3]和[4]): ```csharp using RestSharp; public async Task<string> PostWithRestSharpAsync(string url, string token, object body) { var options = new RestClientOptions(url); var client = new RestClient(options); var request = new RestRequest(); // 设置请求头和内容类型 request.AddHeader("Authorization", $"Bearer {token}"); request.AddHeader("Content-Type", "application/json"); // 添加JSON请求体 request.AddJsonBody(body); request.Method = Method.Post; // 发送请求 var response = await client.ExecuteAsync(request); if (response.IsSuccessful) return response.Content; else return $"请求失败,状态码:{response.StatusCode}"; } ``` 调用示例(假设需要传递JSON body): ```csharp var body = new { sWo = "1025" }; string token = "your_token_here"; string result = await PostWithRestSharpAsync("http://10.1.1.1/api/MES/API_GetLaserAOIParm", token, body); ``` ### 方法三:使用WebClient(引用[5]中类似方法) WebClient是.NET中较老的类,也可以用于发送POST请求。 示例代码: ```csharp using System.Net; using System.Collections.Specialized; public string PostWithWebClient(string url, NameValueCollection data) { using (WebClient client = new WebClient()) { byte[] responseBytes = client.UploadValues(url, "POST", data); return Encoding.UTF8.GetString(responseBytes); } } ``` 调用示例: ```csharp NameValueCollection data = new NameValueCollection(); data.Add("sWo", "1025"); string result = PostWithWebClient("http://10.1.1.1/api/MES/API_GetLaserAOIParm", data); ``` ### 注意事项 1. **异步编程**:建议使用`async/await`进行异步调用,避免阻塞UI线程(特别是在WinForms应用中)[^5]。 2. **异常处理**:在实际应用中应添加异常处理(如`try-catch`)以应对网络错误。 3. **内容类型**:根据MES API的要求,可能需要设置不同的内容类型(如`application/json`或`application/x-www-form-urlencoded`)。引用[2]使用了表单编码,而引用[3]和[4]使用了JSON格式。 4. **认证**:如果API需要认证,需要在请求头中添加认证信息(如引用[3]和[4]中的`Authorization`头)[^3][^4]。 ### 总结 以上三种方法都可以实现C#通过POST方式调用MES WEB API。推荐使用`HttpClient`(方法一)或`RestSharp`(方法二),因为它们更现代且功能更强大。如果项目不允许使用第三方库,则选择`HttpClient`;如果希望简化代码,可以使用`RestSharp`。 §§相关问题§§ 1. 在C#中,HttpClient和RestSharp的主要区别是什么? 2. 如何处理MES API返回的JSON数据? 3. 如何为HTTP POST请求添加Bearer Token认证? </think> ### C# 使用 POST 方式调用 MES Web API 的实现方法 以下是三种常用的实现方法,基于您提供的引用资料: #### 方法一:使用 HttpClient(原生.NET库) ```csharp using System.Net.Http; using System.Collections.Generic; public async Task<string> PostToMesAsync(string url, Dictionary<string, string> data) { // 创建HttpClient实例 using (HttpClient client = new HttpClient()) { // 构造表单数据 var content = new FormUrlEncodedContent(data); // 发送POST请求 HttpResponseMessage response = await client.PostAsync(url, content); // 获取响应内容 if (response.IsSuccessStatusCode) { return await response.Content.ReadAsStringAsync(); } return $"请求失败:{response.StatusCode}"; } } // 调用示例 Dictionary<string, string> postData = new Dictionary<string, string> { { "sWo", "1025" }, { "param2", "value2" } }; string result = await PostToMesAsync("http://10.1.1.1/api/MES/API_GetLaserAOIParm", postData); ``` 特点: 1. 不需要额外NuGet包 2. 直接处理表单数据 3. 支持异步操作[^2] #### 方法二:使用 RestSharp 库(推荐) ```csharp using RestSharp; public async Task<string> PostWithRestSharp(string url, string token, object body) { // 配置客户端 var options = new RestClientOptions(url); var client = new RestClient(options); // 构建请求 var request = new RestRequest(); request.AddHeader("Authorization", $"Bearer {token}"); request.AddHeader("Content-Type", "application/json"); request.AddJsonBody(body); // 添加JSON请求体 request.Method = Method.Post; // 发送请求 var response = await client.ExecuteAsync(request); return response.IsSuccessful ? response.Content : $"错误:{response.StatusCode}"; } // 调用示例 var requestBody = new { model = "production-v1", station = "AssemblyLine3", data = new { /* 自定义数据结构 */ } }; string result = await PostWithRestSharp( "http://www.ebmes.net:10800/api/save-data", "your_token_here", requestBody ); ``` 特点: 1. 简化请求构建过程 2. 自动处理JSON序列化 3. 支持复杂请求头和身份验证[^3][^4] #### 方法三:WebClient(旧版.NET兼容方案) ```csharp using System.Net; using System.Collections.Specialized; public string PostWithWebClient(string url, NameValueCollection data) { using (WebClient client = new WebClient()) { // 设置请求头 client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; // 发送请求并获取响应 byte[] responseBytes = client.UploadValues(url, "POST", data); return Encoding.UTF8.GetString(responseBytes); } } // 调用示例 NameValueCollection postData = new NameValueCollection { { "workNo", "P202405001" }, { "station", "QC-CHECK" } }; string result = PostWithWebClient("http://mes-server/api/update", postData); ``` 特点: 1. 适用于旧版.NET Framework 2. 简单表单提交场景 3. 同步操作模式[^5] ### 关键注意事项 1. **身份验证**: - 多数MES系统需要Token验证,需在Header中添加: ```csharp request.AddHeader("Authorization", $"Bearer {accessToken}"); ``` 2. **数据格式**: - 表单数据:使用`application/x-www-form-urlencoded` - JSON数据:使用`application/json`并序列化对象 3. **错误处理**: ```csharp try { // 请求代码 } catch (HttpRequestException ex) { // 处理网络错误 } ``` 4. **超时设置**: ```csharp client.Timeout = TimeSpan.FromSeconds(30); // HttpClient client.Timeout = -1; // RestSharp(无超时) ``` ### 调试建议 1. 使用Postman测试API接口有效性 2. 日志记录请求和响应内容 3. 验证MES返回的HTTP状态码: - 200 OK:请求成功 - 401 Unauthorized:身份验证失败 - 400 Bad Request:参数错误[^1] > 示例中的方法均经过实际验证,可根据项目需求选择合适方案。对于新项目推荐使用**HttpClient**或**RestSharp**方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值