2014-12-03 2 views
8

Ich baue ein kleines Testwerkzeug, das dem Benutzer eine Liste von Webdiensten (die mit WebAPI erstellt wurden) zur Verfügung stellen sollte. Der Benutzer sollte in der Lage sein, einen zu testenden Dienst auszuwählen. Ich verwendeWie kann ich eine Liste verfügbarer Methoden in einem WebAPI-Webdienst abrufen?

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")); 

und bin auf der Suche nach so etwas wie

client.GetAllWebServices() 

, die eine Liste von Methoden geben würde, die der Benutzer sehen kann. Bedeutung, die Methoden, die er am Controller entwickelt hat und testen möchte.

+1

Überprüfen Sie [ApiExplorer] (http://blogs.msdn.com/b/yaohuang1/archive/2012/06/15/using-apiexplorer-to-export-ap Ich-Informationen-zu-Postman-a-Chrome-Erweiterung-für-Test-Web-Apis.aspx), es könnte Sie in Gang bringen. – Michael

+0

Das gibt mir diese: - \t \t methodInfos \t {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 {void set_BaseAddress (System.Uri)} \t + \t \t [3] \t {System.TimeSpan get_Timeout()} \t etc ... Es bietet nicht die Methoden, die der Entwickler geschrieben hat, wie "GetAllCustomers()" – Sarah

+0

Es scheint, dass Kobi Recht hat, wenn es "nicht" sagt kenne "irgendetwas über deine spezifischen API URLs". Vielleicht sollte ich etwas anderes anstelle von HTTPClient verwenden? – Sarah

Antwort

10

Michael war richtig zu erwähnen ApiExplorer. Dies gibt Ihnen Details zu allen WebApi-Methoden für Sie. Sie müssen es nur so formatieren, wie Sie die Antwort wollen.

Hier ist ein einfaches Beispiel, um eine Liste aller Methoden mit ihren Parametern und Rückgabetypen zu erhalten. Sie können natürlich machen diese viel umfassender - nur die Objekte wechseln Sie zu finden, was Sie brauchen:

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; } 
    } 
} 

Das Schöne daran ist, dass es ein WebAPI selbst nennen, so dass Sie die HttpClient können anrufen und zu verarbeiten mit http://www.localhost.com/api/ApiMethod/Methods. Hier ist ein Beispiel JSON Antwort:

[ 
    { 
     "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 
      } 
     ] 
    } 
] 

geht nach vorne

Ersten XML-Dokument kommentiert, ist nicht so eindeutig, aber es gibt ein Tutorial auf MSDN Blogs.

Auch gibt es andere Pakete zur Verfügung, die Sie verwenden können, in Haken, stehlen, die ähnlich zu tun, was Sie brauchen, zum Beispiel

Mehr Details zu diesen in VS Mag

+1

Danke Rhumborl! gab es keine d.ResponseDescription, aber ich brauche es nicht. Und das ist ein bisschen mehr Arbeit als ich erwartet hatte, da dieser extra Controller erstellt werden muss, aber es ist definitiv besser als nichts, und es funktioniert! Danke noch einmal! – Sarah

Verwandte Themen