2015-10-29 29 views
0

我知道有很多不同的情況,類似我的stackoverflow,但我只是無法建立連接。從Java或JS POST到GCM

我想要做的是發送一個簡單的推送通知給GCM。我發現我也嘗試發佈兩個鏈接。注意這兩個鏈接都在我找到的這個PHP腳本中工作。

https://gcm-http.googleapis.com/gcm/send

https://android.googleapis.com/gcm/send

我試圖從JS發送推送通知到GCM,但很多人都表示,這可能是由於安全問題沒有。到目前爲止,當我在Angular JS中執行我的代碼時,我從https://gcm-http.googleapis.com/gcm/send得到了405錯誤。狀態405意味着方法不被接受(參考鏈接http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)。

這是JS的代碼。我有兩種方法,我嘗試過。

方法1:

 var xmlhttp = new XMLHttpRequest(); 

     xmlhttp.onreadystatechange = function() { 

      if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
       //ite 
      } 
     }; 
     var jsonCall = { 
      registration_id: "xxxxxxxxxxxxxxxxxxxxxxxxxxxx-AEQtUUWnCVH566xcwib4HinI16W3_g" 
     }; 
     xmlhttp.open("POST", "https://gcm-http.googleapis.com/gcm/send", true); 
     xmlhttp.setRequestHeader("Content-type", "application/json"); 
     xmlhttp.setRequestHeader("Authorization", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); 
     xmlhttp.send(jsonCall); 

方法2

var jsonCall = { 
      registration_id: "xxxxxxxxxxxxxxxxxxxxxxxxxxxx-AEQtUUWnCVH566xcwib4HinI16W3_g" 
     }; 
     $http({ 
      method:'POST', 
      url: 'https://gcm-http.googleapis.com/gcm/send', 
      data: jsonCall, 
      headers: { 
       'Authorization': 'A1nxxxxxxxxxxxxxxxxxx', 
       'Content-type': 'application/json' } 
     }) 

這是我在Java中都試過了。請注意,我的項目不是作爲Android項目創建的,而是作爲普通的Java項目創建的。我在這裏得到一個411錯誤,所以我認爲我用作JSON的字符串不正確。請注意,如果使用GET,我會得到200。

方法3:

HttpURLConnection connection = null; 
     try { 
     //Create connection 
     String json ="{\"registration_ids\":[\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxx\"]}"; 
     URL url = new URL("https://gcm-http.googleapis.com/gcm/send"); 
     connection = (HttpURLConnection)url.openConnection(); 
     connection.setDoOutput(true); 
     connection.setDoInput(true); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
     connection.setRequestProperty("Content-Length", "0"); 
     connection.setRequestProperty("Authorization", "key="+"xxxxxxxxxxxxxxxxxxxxxxxxxx"); 



     System.out.println(connection.getResponseCode()); 
     InputStream stream = (InputStream) connection.getInputStream(); 
     InputStreamReader isReader = new InputStreamReader(stream); 

     //put output stream into a string 
     BufferedReader br = new BufferedReader(isReader); 
     String line; 
     while((line = br.readLine()) != null){ 
      System.out.println(line); 
     } 

     OutputStream os = connection.getOutputStream(); 
     os.write(json.getBytes("UTF-8")); 
     os.flush(); 
     os.close(); 



     } catch(Exception e){ 
      System.out.println(e); 
     } 

如果有人可以看看這個,把我安置在正確的方向,我將不勝感激。

UPDATE:

我已經擺脫了那個411錯誤。我想這是因爲我從來沒有聯繫過。現在我得到了正確的200代碼,但推送通知不發送。我的JSON是正確的格式嗎?

HttpURLConnection connection = null; 
     try { 
     //Create connection 
     String json ="{\"registration_ids\":[\"APA91bGxHWapgmxgyvPceu85ArDMLaFekbTt5RGzy3gv1xtSO09tJbvnaeVLefBqNl_iBrctoZQ2AltSMfrXykq8-AEQtUUWnCVH566xcwib4HinI16W3_g\"]}"; 
     URL url = new URL("https://gcm-http.googleapis.com/gcm/send"); 
     connection = (HttpURLConnection)url.openConnection(); 
     connection.setDoOutput(true); 
     connection.setDoInput(true); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Content-Type", "application/json");  
     connection.setRequestProperty("Authorization", "key=xxxxxxxxxxxxxxxxxxxxxxx"); 


     connection.connect(); 
     OutputStream os = connection.getOutputStream(); 
     os.write(json.getBytes("UTF-8")); 
     System.out.println(connection.getResponseCode()); 
     InputStream stream = (InputStream) connection.getInputStream(); 
     InputStreamReader isReader = new InputStreamReader(stream); 

     //put output stream into a string 
     BufferedReader br = new BufferedReader(isReader); 
     String line; 
     while((line = br.readLine()) != null){ 
      System.out.println(line); 
     } 


     os.flush(); 
     os.close(); 



     } catch(Exception e){ 
      System.out.println(e); 
     } 

回答

1

這已使用Java方法解決。 JS繼續返回400,401,411等狀態碼。事實證明,Java返回了200的原因,但我的手機沒有收到任何東西,因爲我的JSON不正確。以下是正確的JSON值:

String postData = "{ \"registration_ids\": [ \"" + CLIENT_REG_ID + "\" ], " + 
       "\"delay_while_idle\": true, " + 
       "\"data\": {\"tickerText\":\"My Ticket\", " + 
       "\"contentTitle\":\"My Title\", " + 
       "\"message\": \"Test GCM message from GCMServer-Android\"}}"; 

這是從我發佈的另一個問題獲得的,其中一位SO成員提供了此解決方案。