PCL

2016-05-12 11 views
-1

のためのRESTfulなHTTPクライアントを構築コンテキストPCL

最近、私は、C#/。NETで動作Xamarinを使用して、モバイルプロジェクトに取り組んで始めました。私はアンドロイドアプリとJava開発の一般的な開発から来た。 thisというアプリケーションでhttpクライアントをビルドするときは、私はいつも同じスキームを使います。私はそれが必要である場合にのみ、上書きの概念が好きです。このJava RESTfulなhttpクライアントをC#/ .NET RESTfulなhttpクライアントに翻訳したいと思います。

await MakeGetRequest<List<Role>>(Constants.RolesEnpoint) 
      .OnSuccess((response) => 
      { 
       //Response which is of type List<Role> 
       ShowList(response); 
      }) 
      .OnError((exception) => 
      { 
       ShowErrorMessage("Unkown error:" + exception.Message); 
      }) 
      .OnInternatServerError(() => 
      { 
       ShowErrorMessage("The server explode"); 
      }); 

よく、主に私が直面してる問題は、私はそれらのラムダコールバックを実装する方法については本当によく分からないということです。私はこのようになりますAPIを持っているしたいと思います

。私がこれまでにやったことです:私はちょうど右方向に指摘されている具体的な答え、またはフルコード答えを、したくない

//<summary> 
    // Makes a get request and deserializes the result JSON as T class objects. 
    // Check https://forums.xamarin.com/discussion/22732/3-pcl-rest-functions-post-get-multipart 
    //</summary> 
    //<param name="endpoint">The endpoint name i.e. "/api/v1/feed"</param> 
    //<param name="auth">True if we want to seth the AUTH_TOKEN cookie. False otherwise.</param> 
    private async RequestTask<T> MakeGetRequest<T>(string endpoint, bool auth = true) 
    { 
     await new RequestTask<T>((rt) => 
     { 
      try 
      { 
       ValidateAuthToken(); 
       var request = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress, endpoint)); 
       SetHeaders(request); 
       if (string.IsNullOrEmpty(authToken)) 
       { 
        rt.OnAuthTokenError(); 
       } 
       request.Headers["Cookie"] = authToken; 
       request.Method = "GET"; 

       HttpWebResponse response = await request.GetResponseAsync(); 

       if (!response.StatusCode.Equals(HttpStatusCode.OK)) 
       { 
        rt.OnHttpError(response.StatusCode); 
        switch (response.StatusCode) 
        { 
         case HttpStatusCode.Forbidden: 
          rt.OnForbidden(); 
          break; 
         case HttpStatusCode.InternalServerError: 
          rt.OnInternalServerError(); 
          break; 
         case HttpStatusCode.RequestTimeout: 
          rt.OnRequestTimeout(); 
          break; 
         case HttpStatusCode.GatewayTimeout: 
          rt.OnGatewayTimeout(); 
          break; 
         case HttpStatusCode.NotFound: 
          rt.OnNotFound(); 
          break; 
         case HttpStatusCode.Unauthorized: 
          rt.OnUnauthorized(); 
          break; 
        } 
       } 

       var respStream = response.GetResponseStream(); 
       respStream.Flush(); 

       using (StreamReader sr = new StreamReader(respStream)) 
       { 
        //Need to return this response 
        string strContent = sr.ReadToEnd(); 
        respStream = null; 
        rt.OnSuccess(JsonConvert.DeserializeObject<T>(strContent, dateTimeConverter)); 
       } 
      } 
      catch (Exception e) 
      { 
       rt.OnError(e); 
      } 
     }); 
    } 

+0

さて、あなただけのアクションを期待して3つの機能を必要とする、これらを保存しますあなたの名前はアグスティンですか? – Gusman

+0

いいですね、小さなスニペットを提供できますか?私は同じ解決策を考えましたが、例えば、そのクラスでは 'Action 'をローカルに保存して、[BuilderObject](http://www.javaworld.com/article/2074938/core-java)をどのように作成するのでしょうか。 /too-many-parameters-in-java-methodspart3-builder-pattern.html)。私の主な問題は、ラムダコールバック関数の呼び出し/宣言方法です。そしてはい、私の名前はAgustin:Pです。 – 4gus71n

+0

また、あなたの関数は同じオブジェクトを返す必要があります。 – Gusman

答えて

0

それは簡単です、あなたがしたいことは流暢なAPIであり、それはそれのためにいくつかのアクションを受け入れる必要があり、このような何か:

public class RestClient 
{ 
    Action<HttpWebResponse> onSuccess; 
    Action<HttpWebResponse> onError; 
    Action<HttpWebResponse> onInternalServerError; 

    public RestClient OnSuccess(Action<HttpWebResponse> Handler) 
    { 
     onSuccess = Handler; 
     return this; 
    } 

    public RestClient OnError(Action<HttpWebResponse> Handler) 
    { 
     onError = Handler; 
     return this; 
    } 

    public RestClient OnInternalServerError(Action<HttpWebResponse> Handler) 
    { 
     onInternalServerError= Handler; 
     return this; 
    } 

    private async RequestTask<T> MakeGetRequest<T>(string endpoint, bool auth = true) 
    { 

     //lots of code, blablabla, just let's go on the handling 

     switch(response.StatusCode) 
     { 
      case HttpStatusCode.OK: 

       if(onSuccess != null) 
        onSuccess(response); 
       break; 

      case HttpStatusCode.InternalServerError: 

       if(onInternalServerError!= null) 
        onInternalServerError(response); 
       break; 

      default: 

       if(onError!= null) 
        onError(response); 
       break; 
     } 

    } 
} 
+0

なぜdownvote? – Gusman

+0

スペイン語を知らない人よりもあなたの利点のために。 – EZI

+0

どのような利点がありますか?質問と答えは英語ですが、彼が話したことはスペイン語での質問に過ぎません。だから彼は質問のものより多くの兆候を私に与えませんでした。 – Gusman