2013-04-18 70 views
0

我試圖通過C#的RestSharp API向訂閱我的頻道的所有設備發送通知提醒。這是我的代碼看起來像:爲什麼我不能使用C#中的Appcelerator REST API發送推送通知?

public void SendPush() 
    { 
     try 
     { 

      var client = new RestClient(" https://api.cloud.appcelerator.com"); 
      var request = new RestRequest("/v1/push_notification/notify.json?key=appkey", Method.POST) 
      { 
       RequestFormat = DataFormat.Json, 
      }; 
      request.AddBody(new 
      { 
       channel = "alert", payload = new { title = "notificación", badge = 1, alert = "alerta: proximo arribo de sismo a la ciudad de mexico", sound = "default" } 
      }); 
      var response = client.Execute(request); 
      var content = response.Content; 
      Debug.WriteLine(content); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine("Message " + ex.Message + " \n Inner Exception " + ex.InnerException + " \n Stack Trace" + ex.StackTrace); 
     } 
    } 

我得到的迴應是:

{ 
    "meta": { 
    "status": "fail", 
    "code": 401, 
    "cc_code": 1000, 
    "message": "You need to sign in or sign up before continuing." 
    } 
} 

爲什麼問我登錄?所有我想做的事情是發送一個通知消息給設備。

任何幫助將不勝感激。

EDIT

我能夠登錄,所述連接信息存儲到的CookieContainer併發送通知請求,但是我無法發送有效載荷參數作爲對象。

這是我的新登錄功能的樣子:

public void Login() 
    { 
     client = new RestClient("https://api.cloud.appcelerator.com"); 
     client.CookieContainer = new System.Net.CookieContainer(); 
     request = new RestRequest("/v1/users/login.json?key={appkey}", Method.POST) 
     { 
      RequestFormat = DataFormat.Json 
     }; 
     request.AddUrlSegment("appkey", "key"); 
     request.AddBody(new 
     { 
      login = "user", 
      password = "pass" 
     }); 
     var response = client.Execute(request); 
     var content = response.Content; 
     Debug.WriteLine(content); 
     SendPush(); 
    } 

這是我SendPush功能看起來像現在:

public void SendPush() 
    { 
     try 
     { 
      client.BaseUrl = "https://api.cloud.appcelerator.com"; 
      request.Resource = "/v1/push_notification/notify.json?key={appkey}"; 
      request.Method = Method.POST; 
      request.AddUrlSegment("appkey", "key"); 


      request.AddParameter("channel", "alert"); 
      request.AddParameter("payload", new 
       { 
        title = "notification", 
        badge = 1, 
        alert = "Warning", 
        sound = "default" 
       }); 
      var response = client.Execute(request); 
      var content = response.Content; 
      Debug.WriteLine(content); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine("Message " + ex.Message + " \n Inner Exception " + ex.InnerException + " \n Stack Trace" + ex.StackTrace); 
     } 
    } 

我試圖發送一個對象作爲參數,但它似乎不是有效的,我不知道爲什麼。如果我只是想送點東西是這樣的:

  request.AddParameter("payload", "Warning"); 

我從Appcelerator的API的響應,但不是我想在移動應用程序的行爲,因爲負載丟失了幾個屬性。

我應該如何將該對象作爲參數與RestSharp一起發送?或者RestSharp不允許?我有什麼選擇?

回答

2

,我發現這樣做的方法。首先,我必須先登錄並保存會話在這樣的的CookieContainer:

public void Login() 
    { 
     client = new RestClient("https://api.cloud.appcelerator.com"); 
     client.CookieContainer = new System.Net.CookieContainer(); 
     request = new RestRequest("/v1/users/login.json?key={appkey}", Method.POST) 
     { 
      RequestFormat = DataFormat.Json, 
     }; 
     request.AddUrlSegment("appkey", "key"); 
     request.AddBody(new 
     { 
      login = "user", 
      password = "pass" 
     }); 
     var response = client.Execute(request); 
     SendPush(); 
    } 

然後,我讓我的SendPush方法的調用看起來像現在這樣:

public void SendPush() 
    { 
     try 
     { 
      client.BaseUrl = "https://api.cloud.appcelerator.com"; 
      request.Resource = "/v1/push_notification/notify.json?key={appkey}"; 
      request.Method = Method.POST; 
      request.AddUrlSegment("appkey", "key"); 

      request.AddParameter("channel", "alert"); 
      request.AddParameter("payload", "{ \"title\" : \"notificación\", \"badge\" : 1, \"alert\" : \"alerta: Sismo detectado en: " + direccion + " proximo arribo de sismo a la ciudad de mexico\", \"sound\" : \"default\"}"); 
      var response = client.Execute(request); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine("Message " + ex.Message + " \n Inner Exception " + ex.InnerException + " \n Stack Trace" + ex.StackTrace); 
     } 
    } 

我遇到了麻煩送有效載荷對象,因此我決定使用AddParameter作爲字符串發送它,並且它沒有任何問題,這可以使用JavaScriptSerializerJSON.NET的JsonConverter完成。希望它可以幫助其他人。

+0

我正在嘗試相同的代碼,但它不工作。即使提供了正確的用戶名和密碼後,它也會提示其中任何一個都不正確。我可以登錄儀表板並從那裏訪問應用程序。任何想法,爲什麼我得到這個錯誤? – Soumya

+0

我有一段時間沒有與Appcelerator一起工作,但我想當你說你可以登錄到儀表板時,你是在引用Appcelerator用戶的憑據,而不是用戶集合中的用戶。不要使用您的Appcelerator憑據登錄,您需要使用您在用戶集合中創建的用戶,這些用戶是您想要登錄到您的應用的用戶。我會稍後檢查,但這應該是你的問題。 –

+0

好的。但是在登錄儀表板後,我可以進入箭頭面板,然後我可以發送推送消息到註冊的設備。我在客戶端使用令牌方法。 – Soumya

0

您需要提供一個有效的應用程序鍵

var myAppKey = "WhateverYourAppKeyIs"; 
var request = new RestRequest("/v1/push_notification/notify.json?key=" + myAppKey , Method.POST) 
+0

我這樣做,我已經試過生產和開發關鍵,它沒有奏效。 –

+0

如果是這種情況,那麼您可能需要聯繫Appcelerator支持。從我所知道的問題來看,這個問題似乎沒有出現在你的代碼中。 – cgotberg

+0

檢查我編輯的問題,似乎我不得不登錄到最後並將信息存儲到CookieContainer中,但我無法將對象作爲參數發送出去,有什麼想法? –

相關問題