1. 程式人生 > 其它 >c# 客戶端呼叫 asp.net core webapi

c# 客戶端呼叫 asp.net core webapi

public class WebApiClient
{

  //webapi基地址
  private Uri baseUri;

  //http請求物件
  HttpClient webApi = null;

  //webapi元資料型別
  private string mediaType;


  public WebApiClient(string baseUri, string mediaType = "application/json") : this(new Uri(baseUri), mediaType)
  {
  }

  public WebApiClient(Uri baseUri, string mediaType = "application/json")
  {
    this.baseUri = baseUri;
    this.mediaType = mediaType;


    webApi = new HttpClient();
    webApi.BaseAddress = baseUri;
    webApi.DefaultRequestHeaders.Accept.Clear();
    webApi.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(mediaType));
  }

  //get請求

  public async Task<T> GetApi<T>(string controlerName, string funcName, List<Tuple<string, object>> apiParams = null, params Tuple<string, object>[] heads) where T : FuncResult, new()
  {
    if (apiParams != null && apiParams.Count > 0)
    {
      var paramString = new StringBuilder();
      foreach (var param in apiParams)
      {
        paramString.Append('&').Append(param.Item1).Append("=").Append(param.Item2);
      }

      funcName = funcName + "?" + paramString.ToString().Substring(1);
    }

    return await Call<T>(controlerName, funcName, method: HttpMethod.Get, heads: heads);
  }

  public async Task<T> PostApi<T>(string controlerName, string funcName, object apiParam, params Tuple<string, object>[] heads) where T :     FuncResult, new()
  {
    return await Call<T>(controlerName, funcName, apiParam, HttpMethod.Post, heads: heads);
  }

  public async Task<T> PutApi<T>(string controlerName, string funcName, object apiParam, params Tuple<string, object>[] heads) where T :     FuncResult, new()
  {
    return await Call<T>(controlerName, funcName, apiParam, HttpMethod.Put, heads: heads);
  }

  public async Task<T> DeleteApi<T>(string controlerName, string funcName, object apiParam, params Tuple<string, object>[] heads) where T :     FuncResult, new()
  {
    return await Call<T>(controlerName, funcName, apiParam, HttpMethod.Delete, heads: heads);
  }

  async Task<T> Call<T>(string controlerName, string funcName, object apiParam = null, HttpMethod method = null, params Tuple<string,     object>[] heads) where T : FuncResult, new()
  {
    T result = new T();

    try
    {
      using (var message = new HttpRequestMessage(method, $"{controlerName}/{funcName}"))
      {
        //設定header資訊
        if (heads != null && heads.Length > 0)
        {
          var headStringBuilder = new StringBuilder();
          foreach (var head in heads)
          {
            message.Headers.Add(head.Item1, head.Item2.ToString());
          }
        }

        if (apiParam != null)
        {
          message.Content = new StringContent(JsonConvert.SerializeObject(apiParam), Encoding.UTF8, mediaType);
        }

        var jsonResult = await webApi.Send(message).Content.ReadAsStringAsync();
        if (!string.IsNullOrEmpty(jsonResult))
        {
          result = JsonConvert.DeserializeObject<T>(jsonResult);
        }
        else
        {
          result.SetError("webapi return json is null.");
        }
      }
    }
    catch (Exception ex)
    {
      result.SetError(ex);
    }

    return result;
  }

   }