//------------------------------------------------------------------------------ // 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 // 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 // CSDN博客:https://blog.csdn.net/qq_40374647 // 哔哩哔哩视频:https://space.bilibili.com/94253567 // Gitee源代码仓库:https://gitee.com/RRQM_Home // Github源代码仓库:https://github.com/RRQM // API首页:https://www.yuque.com/rrqm/touchsocket/index // 交流QQ群:234762506 // 感谢您的下载和使用 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ using System; using System.Threading.Tasks; using TouchSocket.Core; using TouchSocket.Http; using TouchSocket.Rpc.TouchRpc; namespace TouchSocket.Rpc.WebApi { /// /// WebApi客户端 /// public class WebApiClient : HttpClientBase, IWebApiClient { /// /// 构造函数 /// public WebApiClient() { m_stringConverter = new StringConverter(); } /// /// /// public Func TryCanInvoke { get; set; } private readonly StringConverter m_stringConverter; /// /// 字符串转化器 /// public StringConverter StringConverter => m_stringConverter; #region RPC调用 /// /// Rpc调用 /// /// 方法名 /// 调用配置 /// 参数 /// /// /// /// /// public T Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) { string[] strs = method.Split(':'); if (strs.Length != 2) { throw new RpcException("不是有效的url请求。"); } if (invokeOption == default) { invokeOption = InvokeOption.WaitInvoke; } HttpRequest request = new HttpRequest(); switch (strs[0]) { case TouchSocketHttpUtility.Get: { request.InitHeaders() .SetHost(RemoteIPHost.Host) .SetUrl(strs[1].Format(parameters)) .AsGet(); break; } case TouchSocketHttpUtility.Post: { request.InitHeaders() .SetHost(RemoteIPHost.Host) .SetUrl(strs[1].Format(parameters)) .AsPost(); if (parameters.Length > 0) { request.FromJson(parameters[parameters.Length - 1].ToJson()); } break; } default: break; } HttpResponse response = RequestContent(request, false, invokeOption.Timeout, invokeOption.Token); if (invokeOption.FeedbackType != FeedbackType.WaitInvoke) { return default; } if (response.StatusCode == "200") { return (T)m_stringConverter.ConvertFrom(response.GetBody(), typeof(T)); } else if (response.StatusCode == "422") { throw new RpcException(response.GetBody().FromJson().Message); } else { throw new RpcException(response.StatusMessage); } } /// /// Rpc调用 /// /// 方法名 /// 调用配置 /// 参数 /// /// /// /// public void Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) { string[] strs = method.Split(':'); if (strs.Length != 2) { throw new RpcException("不是有效的url请求。"); } if (invokeOption == default) { invokeOption = InvokeOption.WaitInvoke; } HttpRequest request = new HttpRequest(); switch (strs[0]) { case TouchSocketHttpUtility.Get: { request.InitHeaders() .SetHost(RemoteIPHost.Host) .SetUrl(strs[1].Format(parameters)) .AsGet(); break; } case TouchSocketHttpUtility.Post: { request.InitHeaders() .SetHost(RemoteIPHost.Host) .SetUrl(strs[1].Format(parameters)) .AsPost(); if (parameters.Length > 0) { request.FromJson(parameters[parameters.Length - 1].ToJson()); } break; } default: break; } HttpResponse response = RequestContent(request, false, invokeOption.Timeout, invokeOption.Token); if (invokeOption.FeedbackType != FeedbackType.WaitInvoke) { return; } if (response.StatusCode == "200") { return; } else if (response.StatusCode == "422") { throw new RpcException(response.GetBody().FromJson().Message); } else { throw new RpcException(response.StatusMessage); } } /// /// Rpc调用 /// /// 方法名 /// 调用配置 /// 参数 /// /// /// public void Invoke(string method, IInvokeOption invokeOption, params object[] parameters) { Invoke(method, invokeOption, ref parameters, null); } /// /// Rpc调用 /// /// 方法名 /// 调用配置 /// 参数 /// /// /// /// public T Invoke(string method, IInvokeOption invokeOption, params object[] parameters) { return Invoke(method, invokeOption, ref parameters, null); } /// /// 函数式调用 /// /// 函数名 /// 参数 /// Rpc调用设置 /// /// /// public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) { return EasyTask.Run(() => { Invoke(method, invokeOption, parameters); }); } /// /// 函数式调用 /// /// 方法名 /// 参数 /// Rpc调用设置 /// 调用超时 /// Rpc异常 /// 其他异常 /// 服务器返回结果 public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) { return EasyTask.Run(() => { return Invoke(method, invokeOption, parameters); }); } #endregion RPC调用 } }