如何在Vapor中向Firebase云消息API发送POST请求

如何在Vapor中向Firebase云消息API发送POST请求,firebase,firebase-cloud-messaging,vapor,Firebase,Firebase Cloud Messaging,Vapor,我试图使用Vapor 1.5和Firebase遗留协议向Firebase Notifications API发出POST请求,但收到失败响应 响应是JSON(节点:node.node.object([“multicast\u id”: 节点号(5936281277445399934),“故障”:节点号(0), “规范的_id”:Node.Node.number(0),“results”: Node.Node.array([Node.Node.object([“message_id”): Node

我试图使用Vapor 1.5和Firebase遗留协议向Firebase Notifications API发出POST请求,但收到失败响应

响应是JSON(节点:node.node.object([“multicast\u id”: 节点号(5936281277445399934),“故障”:节点号(0), “规范的_id”:Node.Node.number(0),“results”: Node.Node.array([Node.Node.object([“message_id”): Node.Node.string(“0:1527074314969790%c7ade8b9f9fd7ecd”))], “成功”:节点.节点.编号(1)])

编辑 通过邮递员发出请求失败,错误为“请求缺少身份验证密钥(FCM令牌)”

  • 发送通知(有效负载:)
    中,我有一个输入错误,我错过了键后的
    =
    。它应该是
    “key=\(fcmLegacyServerKey)”
  • sendNotification(payload:)
    中,不应调用
    payload.makeBody
    ,我应该将JSON对象
    payload
    作为参数传递给.post请求
  • 通知的JSON对象显然从一开始就格式不好。我想发送的消息类型是通知,但我传入了一个名为
    aps
    的密钥。我应该已通过键
    通知
    ,如下所示


    嘿,比尔西。看到你在上一篇文章中的评论,来到这里。我以前没有使用过vapor,但是授权值的格式是否应该像
    “key\(fcmLegacyServerKey)”
    ?它不应该是普通服务器键值吗?如果这不起作用,也许可以遵循通过邮递员发送的格式,即“key=(fcmLegacyServerKey)”?@AL。我附上了邮递员的屏幕截图,该请求也返回401。那应该是200美元。现在,回到您的问题fcmLegacyServerKey:String是一个变量,所以使用“key=(fcmLegacyServerKey)”是合法的,本质上就像“key=123456AA”
    class FirebaseRequester {
     let fcmLegacyServerKey = "AIzaSyDSuXXXXXXkCafTQay5_r8j3snvVos"
    
     func sendNotification(payLoad: JSON) throws -> Response {
    
        var response: Response?
        do {
            let responseFCM = try drop.client.post("https://fcm.googleapis.com/fcm/send", 
               headers: ["Content-Type":"application/json","Authorization": "key\(fcmLegacyServerKey)"], 
               query: [:], 
              body: payLoad.makeBody())
    
            response = responseFCM
    
        }catch let error {
            let message = error.localizedDescription
            logErr.prints(message: message)
            throw Abort.custom(status: .badRequest, message: message)
        }
    
        guard let rsp = response?.json else {
    
    
            let message = "no json received on line \(#line)"
            drop.log.error(message)
            logErr.prints(message: message)
            throw Abort.custom(status: .badRequest, message: message)
         }
      print("rsp in json format is \(rsp)")
          return response!
     }//end of sendNotification()
    }//end of class FirebaseRequester
    
    
    
    
          //make another class here and initialize it with  FirebaseRequester
          //get data from Client App 
          // validate data 
          // finally, create the payLoad and call sendNotification(:)
         //request should look like 
    {
      "aps": {
        "alert": "Breaking News!",
        "sound": "default",
        "link_url": "https://raywenderlich.com"
     }
    }
    
         let fcmKeyToSendTo = "someDeviceTokenKeyReceivedFromClient_biHZNI-e9E53WEkCzrki"
    
                let data = try Node(node: ["alert": "alert", "sound": "sound", "link_url": "https://www.someWebsite.com"])
    
         var payLoadObj = try JSON(node: ["aps" : data])
         payLoadObj["to"] = try JSON(node: fcmKeyToSendTo)
    
                do {
                    let _ = try firebaseRequester.sendNotification(payLoad: payLoadObj)
                }catch{
                    logErr.prints(message: error.localizedDescription)
                }
    
                let message = "notification Sent"
                return try JSON(node:["success":message])
    
    class FirebaseRequester {
    
      let fcmLegacyServerKey = "AIzaSy....vVos"
    
      func sendNotification(payLoad: JSON) throws -> Response {
    
      var response: Response?
       do {
         let responseFCM = try drop.client.post("https://fcm.googleapis.com/fcm/send", 
           headers: ["Content-Type":"application/json","Authorization": "key=\(fcmLegacyServerKey)"], 
           query: [:], 
          body: payLoad
    
          response = responseFCM
    
      }catch let error {
         let message = error.localizedDescription
         logErr.prints(message: message)
         throw Abort.custom(status: .badRequest, message: message)
     }
       guard let rsp = response?.json else {
    
        let message = "no json received on line \(#line)"
        drop.log.error(message)
        logErr.prints(message: message)
        throw Abort.custom(status: .badRequest, message: message)
       }
        return response!
      }//end of sendNotification()
    }//end of class FirebaseRequester
    
    
    
    class TestRouteNow {
    
      let firebaseRequester: FirebaseRequester
    
      init(firebaseRequester: FirebaseRequester) {
         self.firebaseRequester = firebaseRequester
      }
    
      func addRoutes(drop: Droplet) {
         drop.post("test", "notif", handler: postNotification)
      }
    
       func postNotification(request: Request) throws -> ResponseRepresentable {
    
       let fcmDevice = "someDeviceTokenReceivedFromClientApp"
       let data = try Node(node: ["title": "title","body": "body", "sound": "default", "badge":"60"])
    
        var payLoadObj = try JSON(node: ["notification": data])
        payLoadObj["to"] = try JSON(node: fcmDevice)
    
          do {
            let _ = try firebaseRequester.sendNotification(payLoad: payLoadObj)
                }catch{
                    logErr.prints(message: error.localizedDescription)
                }
    
                let message = "notification Sent"
                return try JSON(node:["success":message]) 
         } 
     }//end of class
    
    
    
    
        // request body
    {
      "to" : "cQDtm_someDeviceTokenReceivedFromClient",
      "priority":"high",
    
     "notification": {
         "title":"Booking Rescheduled",
          "body": "Cancelled Booking 7830593, for Mon, 12 March",
          "sound":"default",
         "badge": "100"
      }
    }