2016-06-22 21 views
5

'u kullanmak için Java eşdeğeri nedir? Firebase REST Api'yi kullanarak bir bildirim göndermek için Curl'de aşağıdaki komutu denedim ve şu işe yarar:https://fcm.googleapis.com/fcm/send REST Api

curl -X POST --header "Authorization: key=AIza...iD9wk" --Header "Content-Type: application/json" https://fcm.googleapis.com/fcm/send -d "{\"notification\":{\"title\": \"My title\", \"text\": \"My text\", \"sound\": \"default\"}, \"to\": \"cAhmJfN...bNau9z\"}" 

Java'da da aynısını yapmaya çalıştığım için, aynı şeyi yapmanın kolay bir yolunu bulamadım ve mobil cihazımdaki bildirimi tetiklemeyi denedim.

Bu benim en yakın yaklaşımdır:

try { 
     HttpURLConnection httpcon = (HttpURLConnection) ((new URL("https://fcm.googleapis.com/fcm/send").openConnection())); 
     httpcon.setDoOutput(true); 
     httpcon.setRequestProperty("Content-Type", "application/json"); 
     httpcon.setRequestProperty("Authorization: key", "AIza...iD9wk"); 
     httpcon.setRequestMethod("POST"); 
     httpcon.connect(); 
     System.out.println("Connected!"); 

     byte[] outputBytes = "{\"notification\":{\"title\": \"My title\", \"text\": \"My text\", \"sound\": \"default\"}, \"to\": \"cAhmJfN...bNau9z\"}".getBytes("UTF-8"); 
     OutputStream os = httpcon.getOutputStream(); 
     os.write(outputBytes); 
     os.close(); 

     // Reading response 
     InputStream input = httpcon.getInputStream(); 
     try (BufferedReader reader = new BufferedReader(new InputStreamReader(input))) { 
      for (String line; (line = reader.readLine()) != null;) { 
       System.out.println(line); 
      } 
     } 

     System.out.println("Http POST request sent!"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Ama sonra alıyorum:

java.io.IOException: Server returned HTTP response code: 401 for URL: https://fcm.googleapis.com/fcm/send 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1625) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) 
    at httpclient.test.MyHttpClientPost.sendNotification(MyHttpClientPost.java:131) 
    at httpclient.test.MyHttpClientPost.main(MyHttpClientPost.java:26) 
+3

İyi yazılmış bir soru için teşekkürler. Basit bir sorun, ancak birisinin probleminizi tespit etmesi ve gerçekten yardım etmesi için gerekli tüm detayları sağladınız. Daha da önemlisi, bu soru gelecekte StackOverflow'un _whole point_i olan bir başkasına yardım edebilir ve buna güzel katkıda bulunmuş olursunuz. [Neden bu kadar efektif davranıyorum? SO hakkında iyi yazılmış sorular çok az şüphe götürecek kadar azdır] –

cevap

5

401 izinsiz demektir, bu nedenle hiçbir geçerli Authorization başlık gönderildi.

Ve bu satırı:

httpcon.setRequestProperty("Authorization: key", "AIza...iD9wk"); 

-H "Authorization: key=AIza...iD9wk" eşdeğer değil.

httpcon.setRequestProperty("Authorization", "key=AIza...iD9wk"); 

Sonuç olarak, biçimlendirilmiş nasıl HTTP başlığı yanlış: İlk argüman Authorization olan başlığı adı olmalıdır. Temel olarak, üstbilgi adı ve değeri, = değil : ile ayrılır.

+0

Teşekkürler, şimdi çalışıyor. –

+0

Çok iyi tespit edildi. Kodu iki kez okudum ve hala bunu kaçırdım! –

+2

Ayrıca, sunucu anahtarını Firebase konsolundan, ilk başta yaptığım gibi Web API anahtarını değil, "Mesajlaşma" sekmesi altında kopyaladığınızdan emin olun. Aynı görünüyor ama bir 401 verir ve diğeri çalışır ;-) –