2016-06-22 4 views
5

मैंने पहले से ही कर्नल में निम्न आदेश का प्रयास किया है ताकि फायरबेस रीस्ट एपीआई का उपयोग करके अधिसूचना भेजी जा सके और यह काम करता है:जावा का उपयोग करने के बराबर जावा क्या है 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\"}" 

अब जब कि मैं जावा में भी ऐसा ही करने की कोशिश कर रहा हूँ, मैं एक ही और कुछ भी नहीं है कि मैं कोशिश की है अपने मोबाइल endpoint में अधिसूचना चलाता है करने के लिए एक आसान तरीका नहीं पा सके।

यह मेरा सबसे करीबी दृष्टिकोण है:

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

लेकिन तब मैं:

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

एक अच्छी तरह से लिखित प्रश्न के लिए धन्यवाद। एक साधारण मुद्दा, लेकिन आपने किसी को अपनी समस्या को जानने और वास्तव में मदद करने के लिए आवश्यक सभी विवरण प्रदान किए। सबसे महत्वपूर्ण बात यह है कि यह प्रश्न भविष्य में किसी और की मदद कर सकता है, जो स्टैक ओवरफ्लो का _ वोल पॉइंट_ है, और आपने उसमें अच्छी तरह से योगदान दिया है। [मैं इतना प्रभावशाली क्यों हूं? एसओ पर अच्छी तरह से लिखे गए प्रश्न एक दुर्लभता हैं क्योंकि आपको जल्द ही कोई संदेह नहीं होगा] –

उत्तर

5

401 अनधिकृत का मतलब है, तो कोई वैध Authorization हैडर भेजा गया था।

और इस लाइन:

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

-H "Authorization: key=AIza...iD9wk" के बराबर नहीं है।

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

अंत में, आप गलत समझा कैसे HTTP हेडर स्वरूपित है: पहला तर्क हैडर नाम है, जो Authorization है होना चाहिए। असल में हेडर नाम और मान := से अलग नहीं होते हैं।

+0

धन्यवाद, यह अब काम करता है। –

+0

अच्छी तरह से देखा गया। मैंने दो बार कोड पढ़ा और अभी भी इसे याद करने में कामयाब रहा! –

+2

यह भी सुनिश्चित करें कि आप "मैसेजिंग" टैब के अंतर्गत फ़ायरबेस कंसोल से सर्वर कुंजी की प्रतिलिपि बनाते हैं और वेब एपीआई कुंजी जैसे मैंने शुरुआत में नहीं किया था। वे वही दिखते हैं लेकिन एक आपको 401 देता है और दूसरा काम करता है ;-) –

संबंधित मुद्दे