2016-06-22 9 views
5

Próbowałem już następującego polecenia w Curl, aby wysłać powiadomienie za pomocą apara FireFase REST i działa:Co to jest odpowiednik Javy do korzystania z 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\"}" 

Teraz, gdy próbuję zrobić to samo w Javie, nie mogłem znaleźć łatwego sposobu na zrobienie tego samego i nic, co próbowałem, nie wyzwoliło powiadomienia w moim mobilnym punkcie końcowym.

To jest mój najbliższy podejście:

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(); 
    } 

Ale wtedy pojawia się:

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

Dzięki za dobrze napisane pytanie. Prosty problem, ale podałeś wszystkie szczegóły niezbędne, aby ktoś zauważył twój problem i faktycznie pomógł. Co ważniejsze, to pytanie może pomóc komuś innemu w przyszłości, co jest _punktowym punktem StackOverflow, i ładnie się do tego przyczyniłeś. [Dlaczego jestem tak wylewny? Dobrze napisane pytania na temat SO są rzadkością, ponieważ wkrótce na pewno się nauczycie.] –

Odpowiedz

5

401 oznacza nieautoryzowane, więc nie ważne Authorization nagłówek został wysłany.

I ta linia:

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

nie jest równoznaczne z -H "Authorization: key=AIza...iD9wk". Pierwszy argument powinien być nazwa nagłówka, który jest Authorization:

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

Podsumowując, to źle, jak nagłówek HTTP jest sformatowana. Zasadniczo nazwa i wartość nagłówka są oddzielone :, a nie =.

+0

Dzięki, działa teraz. –

+0

Dobrze zauważył. Przeczytałem kod dwa razy i wciąż udało mi się tego nie zauważyć! –

+2

Upewnij się także, że skopiowałeś klucz serwera z konsoli Firebase w zakładce "Messaging", a nie klucz Web API, tak jak na początku. Wyglądają tak samo, ale jeden daje 401, a drugi działa ;-) –

Powiązane problemy