(REST API) Parameter null, obwohl angegeben?

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von BeatsleigherXDA.

    (REST API) Parameter null, obwohl angegeben?

    Guten,

    Ich arbeite gerade an einer REST-API für unser Programm.
    Es werden in der URL Parameter angegeben, um den korrekten Output zu steuern (logisch).

    Ich habe schon hin und her probiert, mir fällt allerdings nichts weiter ein.

    Und zwar: Ein Parameter in der URL ist immer null, auch wenn ich seine Position wechsle (bspw.: statt an dritter Stelle, an zweiter).

    Der Parameter (auch wenn richtig und korrekt übergeben), ist und bleibt null.

    Vielleicht kann mir hier ja jemand helfen.

    Dies war mein erster Versuch; hier flog mir die komplette Anwendung dann um die Ohren:

    C#-Quellcode

    1. public const string SearchRoute = "/search/{domain}/{outputType}/{query}";
    2. public string SearchIndex(string domain, OutputType outputType, string luceneQuery)
    3. => ExecuteCommand("search", outputType == OutputType.Json ? "-json" : "", "--default", domain, Encoding.UTF8.GetString(Convert.FromBase64String(luceneQuery)));


    Mein zweiter Versuch überprüft nun, ob, und welche, Parameter null sind; daher weiß ich, dass der luceneQuery-Parameter immer null ist.

    C#-Quellcode

    1. public const string SearchRoute = "/search/{domain}/{query}/{outputType}";
    2. public string SearchIndex(string domain, string luceneQuery, OutputType outputType) {
    3. if (string.IsNullOrEmpty(domain))
    4. throw new ArgumentNullException("domain");
    5. else if (string.IsNullOrEmpty(luceneQuery))
    6. throw new ArgumentNullException("luceneQuery");
    7. var byteArray = Convert.FromBase64String(luceneQuery);
    8. luceneQuery = Encoding.UTF8.GetString(byteArray);
    9. return ExecuteCommand("search", outputType == OutputType.Json ? "-json" : "", "--default", domain, luceneQuery);
    10. }


    Ich beutze für das Ganze ein WebServiceHost-Objekt:

    C#-Quellcode

    1. serviceHost = new WebServiceHost(this, new Uri(MainClass.systemConfig.GetString("baseRestAPI")));


    Bitte entschuldigt, falls ich mich nicht genug ausgedrückt habe, ich bin ein bisschen im Stress, denn das Ganze soll vorgestern fertig sein (nach dem Motto).

    LG
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BeatsleigherXDA“ ()

    @BeatsleigherXDA Welchen Code muss ich wie aufrufen, um Deinen Effekt zu reproduzieren?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Methode Search(string domain, string luceneQuery, OutputType type) muss, um den Effekt zu reproduzieren, über einen Browser (GET) aufgerufen werden, mit der Route /search/{domain}/{query}/{type}.

    In meinem Fall wäre das localhost:8000/search/de.muster/<base64>/Json

    Die Methoden werden von einem Interface (IRestServices) implementiert:

    C#-Quellcode

    1. using System.ServiceModel;
    2. using System.ServiceModel.Web;
    3. [ServiceContract(Name = "RestServices")]
    4. public interface IRestServices {
    5. #region Lucene Services
    6. /// <summary>
    7. /// Searches the index.
    8. /// </summary>
    9. /// <returns>The search results</returns>
    10. /// <param name="domain">The domain (index) in which to search.</param>
    11. /// <param name="outputType">The output type (clear text, or JSON)</param>
    12. /// <param name="luceneQuery">The Lucene query to search by.</param>
    13. [OperationContract]
    14. [WebGet(UriTemplate = Routing.SearchRoute, BodyStyle = WebMessageBodyStyle.Bare)]
    15. string SearchIndex(string domain, string luceneQuery, OutputType outputType);
    16. //...


    Das Ganze läuft, wie oben erwähnt, mittels WebServiceHost:

    C#-Quellcode

    1. ​serviceHost = new WebServiceHost(this, new Uri("http://localhost:8000/rest"));
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln
    Ok, das Problem hat sich jetzt erledigt.
    Nach stundenlangem Gesuche, hat sich rausgestellt, dass ich in dem Interface einen anderen Parameternamen habe, als in der Routing-Klasse.
    Dies hat dazu geführt, dass die Parameter nicht übergeben werden.

    Ich habe das jetzt angepasst und nun läuft es wie es soll.

    Wie einfach es doch ab und zumal sein kann ^^

    Trotzdem danke, @RodFromGermany!
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln