2014-12-03 57 views
8

我正在構建一個小測試工具,應該爲用戶提供一個Web服務列表(使用WebAPI構建)。用戶應該能夠選擇要測試的服務。 我使用如何獲取WebAPI Web服務中可用方法的列表?

HttpClient client = new HttpClient(); 
client.BaseAddress = new Uri("http://'localhost':51062/"); 

// Add an Accept header for JSON format. 

client.DefaultRequestHeaders.Accept.Add(
       new MediaTypeWithQualityHeaderValue("application/json")); 

,並正在尋找類似

client.GetAllWebServices() 

這將返回的用戶可以看到方法的列表。意思,他在控制器上開發並想測試的方法。

+1

檢查[ApiExplorer](http://blogs.msdn.com/b/yaohuang1/archive/2012/06/15/using-apiexplorer-to-export-ap i-information-to-postman-a-chrome-extension-for-testing-web-apis.aspx),它可能會讓你走。 – Michael 2014-12-03 09:32:48

+0

這使我這些: - \t \t \t methodInfos {System.Reflection.MethodInfo [43]} \t System.Reflection.MethodInfo [] + \t \t [0] \t {System.Net.Http.Headers.HttpRequestHeaders get_DefaultRequestHeaders( )} \t System.Reflection.MethodInfo + \t \t [1] \t {的System.Uri get_BaseAddress()} \t + \t \t [2] \t {無效set_BaseAddress(的System.Uri)} \t + \t \t [3] \t {System.TimeSpan get_Timeout()} \t etc ... 它沒有提供開發人員寫的方法,比如「GetAllCustomers()」 – Sarah 2014-12-03 09:40:34

+0

看來Kobi在說「不」知道「關於您的特定API網址的任何信息」。也許我應該使用別的東西而不是HTTPClient? – Sarah 2014-12-03 09:45:47

回答

10

邁克爾提到ApiExplorer是正確的。這爲您提供了所有WebApi方法的詳細信息。你只需要格式化你想要的反應。

下面是一個簡單的例子,用它們的參數和返回類型來獲取所有方法的列表。當然你也可以讓這個更全面的 - 只是瀏覽的對象找到你需要的東西:

using System.Collections.Generic; 
using System.Linq; 
using System.Web.Http; 
using System.Web.Http.Description; 

namespace WebApplication1.Controllers 
{ 
    public class ApiMethodController : ApiController 
    { 
     public IEnumerable<HelpMethod> GetMethods() 
     { 
      // get the IApiExplorer registered automatically 
      IApiExplorer ex = this.Configuration.Services.GetApiExplorer(); 

      // loop, convert and return all descriptions 
      return ex.ApiDescriptions 
       // ignore self 
       .Where(d => d.ActionDescriptor.ControllerDescriptor.ControllerName != "ApiMethod") 
       .Select(d => 
       { 
        // convert to a serializable structure 
        return new HelpMethod 
        { 
         Parameters = d.ParameterDescriptions.Select(p => new HelpParameter 
         { 
          Name = p.Name, 
          Type = p.ParameterDescriptor.ParameterType.FullName, 
          IsOptional = p.ParameterDescriptor.IsOptional 
         }).ToArray(), 
         Method = d.HttpMethod.ToString(), 
         RelativePath = d.RelativePath, 
         ReturnType = d.ResponseDescription.DeclaredType == null ? 
          null : d.ResponseDescription.DeclaredType.ToString() 
        }; 
       }); 
     } 
    } 

    public class HelpMethod 
    { 
     public string Method { get; set; } 
     public string RelativePath { get; set; } 
     public string ReturnType { get; set; } 
     public IEnumerable<HelpParameter> Parameters { get; set; } 
    } 

    public class HelpParameter 
    { 
     public string Name { get; set; } 
     public string Type { get; set; } 
     public bool IsOptional { get; set; } 
    } 
} 

的好處是,它是一個的WebAPI調用本身,所以你可以使用HttpClient調用並進行處理使用http://www.localhost.com/api/ApiMethod/Methods。下面是一個示例JSON響應:

[ 
    { 
     "Method": "GET", 
     "RelativePath": "api/Account/{id}", 
     "ReturnType": "WebApplication1.Models.Account", 
     "Parameters": [ 
      { 
       "Name": "id", 
       "Type": "System.Int32", 
       "IsOptional": false 
      } 
     ] 
    }, 
    { 
     "Method": "POST", 
     "RelativePath": "api/Account", 
     "ReturnType": null, 
     "Parameters": [ 
      { 
       "Name": "a", 
       "Type": "WebApplication1.Models.Account", 
       "IsOptional": false 
      } 
     ] 
    }, 
    { 
     "Method": "GET", 
     "RelativePath": "api/Maths?i={i}&j={j}", 
     "ReturnType": "System.Int32", 
     "Parameters": [ 
      { 
       "Name": "i", 
       "Type": "System.Int32", 
       "IsOptional": false 
      }, 
      { 
       "Name": "j", 
       "Type": "System.Int32", 
       "IsOptional": false 
      } 
     ] 
    } 
] 

繼續前進

獲取XML文檔註釋出來也不是那麼明確的,但對MSDN Blogs的教程。

此外,還有其他的包,你可以用,勾成,來自該做類似於你需要的東西偷,例如

更多這些細節in VS Mag

+1

謝謝Rhumborl! 沒有d.ResponseDescription,但我不需要它。 由於這個額外的控制器需要被創建,所以這比我期待的要多一點工作,但它比沒有任何東西好得多,而且它工作起來!再次感謝! – Sarah 2014-12-04 13:09:19

相關問題