一、简介
最近,在做一个数据传输的服务,我在一个Worker Service里面需要访问 WebAPI 接口,并传输数据,也可以提交数据。由于第一次使用 RestSharp 发送请求,也遇到了很多问题,不过最终把问题都解决了。什么东西都一样,第一次做都会才很多坑。
今天,我就两个小的知识点,就是通过使用 RestSharp 访问 WebAPI,提交 FromBody 和 FromForm 两种方式的数据,还是有些区别的。我当初也搞了一段时间。
我先说一下我的编码环境:
操作系统:Windows 10 Professional
开发工具:Visual Studio 2022
客户端程序:Worker Service
服务端程序:Net Core WebAPI
框架版本:Net7.0
二、我的代码
以下我就介绍一下,使用 RestSharp、以FromBody 和 FromForm 两种方式提交数据的实现,废话不多说,直接上代码。如果是重点代码,我会以红色标注。
WebAPI 端的代码:
[HttpPost]
public async Task<CommonJsonResult<string>> AddOrUpdateScannerSetting([FromBody]/[FromForm] ScannerSettingInputDto inputDto)
{
}
其他的代码不用细看,都是我的逻辑代码。
Worker Service 端的代码:
1 using (RestClient restClient = new RestClient())
2 {
3 var updateScannerSettingRequest = new RestRequest(new Uri(updateScannerSettingUrl), Method.Post);
4 updateScannerSettingRequest.AddHeader("Authorization", "Bearer " + token);//增加的 JWT 认证
5 updateScannerSettingRequest.AddHeader("Accept", "application/json");
6 updateScannerSettingRequest.RequestFormat = DataFormat.Json;
7
8 #region [FromBody]接收,这里有两种方式,都是可以的
9
10 1、updateScannerSettingRequest.AddParameter("application/json", JsonConvert.SerializeObject(scannerSettingInputDto), ParameterType.RequestBody);
11 2、updateScannerSettingRequest.AddBody(scannerSettingInputDto);
12
13 #endregion
14
15 #region [FromForm]接收,所有字段都需要自己添加
16
17 updateScannerSettingRequest.AddParameter("ScannerId", scannerSettingInputDto.ScannerId);
18 updateScannerSettingRequest.AddParameter("Camera1Id", scannerSettingInputDto.Camera1Id);
19 updateScannerSettingRequest.AddParameter("Camera2Id", scannerSettingInputDto.Camera2Id);
20 updateScannerSettingRequest.AddParameter("Camera3Id", scannerSettingInputDto.Camera3Id);
21 updateScannerSettingRequest.AddParameter("Camera4Id", scannerSettingInputDto.Camera4Id);
22 updateScannerSettingRequest.AddParameter("Camera1IntegrationTime", scannerSettingInputDto.Camera1IntegrationTime);
23 updateScannerSettingRequest.AddParameter("Camera2IntegrationTime", scannerSettingInputDto.Camera2IntegrationTime);
24 updateScannerSettingRequest.AddParameter("Camera3IntegrationTime", scannerSettingInputDto.Camera3IntegrationTime);
25 updateScannerSettingRequest.AddParameter("Camera4IntegrationTime", scannerSettingInputDto.Camera4IntegrationTime);
26 updateScannerSettingRequest.AddParameter("Camera1Image", scannerSettingInputDto.Camera1Image);
27 updateScannerSettingRequest.AddParameter("Camera2Image", scannerSettingInputDto.Camera2Image);
28 updateScannerSettingRequest.AddParameter("Camera3Image", scannerSettingInputDto.Camera3Image);
29 updateScannerSettingRequest.AddParameter("Camera4Image", scannerSettingInputDto.Camera4Image);
30 updateScannerSettingRequest.AddParameter("ScannerCoordinate", scannerSettingInputDto.ScannerCoordinate);
31 updateScannerSettingRequest.AddParameter("PatrolFile", scannerSettingInputDto.PatrolFile);
32 updateScannerSettingRequest.AddParameter("WarningPhone", scannerSettingInputDto.WarningPhone);
33 updateScannerSettingRequest.AddParameter("IsUpdate", scannerSettingInputDto.IsUpdate);
34 updateScannerSettingRequest.AddParameter("Remarks", scannerSettingInputDto.Remarks);
35
36 #endregion
37
38 var updateScannerSettingResponse = await restClient.ExecuteAsync(updateScannerSettingRequest);
39 var updateScannerSettingContent = updateScannerSettingResponse.Content;
40 if (!string.IsNullOrEmpty(updateScannerSettingContent) && !string.IsNullOrWhiteSpace(updateScannerSettingContent))
41 {
42 var commontResultObject = JsonConvert.DeserializeObject<CommonJsonResult<string>>(updateScannerSettingContent);
43 if (commontResultObject != null && commontResultObject.Success)
44 {
45 result = true;
46 }
47 else
48 {
49 result = false;
50 _logger.LogError(updateScannerSettingContent);
51 }
52 }
53 else
54 {
55 result = true;
56 }
57 }
还有一个辅助类型:
1 /// <summary>
2 /// 该类型定义了以 JSON 为返回结果的通用数据格式。
3 /// </summary>
4 /// <typeparam name="TResult">结果的返回类型。</typeparam>
5 public sealed class CommonJsonResult<TResult>
6 {
7 /// <summary>
8 /// 获取或者设置操作的结果是成功还是失败,True 表示操作成功,False 表示操作失败。
9 /// </summary>
10 public bool Success { get; set; }
11
12 /// <summary>
13 /// 获取或者设置操作的结果编码值。
14 /// </summary>
15 public int StateCode { get; set; }
16
17 /// <summary>
18 /// 获取或者设置操作的提示信息。
19 /// </summary>
20 public string? Message { get; set; }
21
22 /// <summary>
23 /// 获取或者设置数据的结果。
24 /// </summary>
25 public TResult? DataResult { get; set; }
26 }
三、总结
好了,记录好了,下次自己有需要就不用急了。不忘初心,继续努力。