【问题标题】:How to send a POST request to Firebase Cloud Messaging API in Vapor如何在 Vapor 中向 Firebase Cloud Messaging API 发送 POST 请求
【发布时间】:2018-11-02 08:30:40
【问题描述】:

我正在尝试使用 Vapor 1.5 和 Firebase Legacy Protocol 向 Firebase Notifications API 发出 POST 请求,但我收到了失败响应。

响应是 JSON(node: Node.Node.object(["multicast_id": Node.Node.number(5936281277445399934),“失败”:Node.Node.number(0), “canonical_ids”:Node.Node.number(0),“结果”: Node.Node.array([Node.Node.object(["message_id": Node.Node.string("0:1527074314969790%c7ade8b9f9fd7ecd")])]), “成功”:Node.Node.number(1)]))

编辑 通过 POSTMan 发出请求失败并出现错误“请求缺少身份验证密钥(FCM 令牌)。”

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])

【问题讨论】:

  • 嘿 bibscy。从您之前的帖子中看到您的评论并来到这里。我以前没有使用过 vapor,但是 Authorization 值应该像"key\(fcmLegacyServerKey)" 这样格式化吗?它不应该是普通的服务器键值吗?如果这不起作用,也许遵循通过邮递员发送时的格式,即"key=(fcmLegacyServerKey)"?
  • @AL。我附上了 PostMan 的截图,该请求也返回 401。那应该返回 200。现在,回到你的问题 fcmLegacyServerKey: String 是一个变量,所以使用 "key=(fcmLegacyServerKey) 是合法的,本质上它就像 "key=123456AA"

标签: firebase firebase-cloud-messaging vapor


【解决方案1】:
  1. sendNotification(payload:) 中我有一个错字,我在键后错过了=。应该是"key=\(fcmLegacyServerKey)"
  2. sendNotification(payload:) 中,不应调用payLoad.makeBody,我应该将JSON 对象payLoad 作为参数传递给.post 请求。
  3. 通知的 JSON 对象从一开始就明显格式错误。我想发送的消息类型是 notification,但我传入了一个名为 aps 的键。我应该传递密钥notification,如下所示。

.

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"
  }
}

【讨论】:

    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 2016-09-22
    相关资源
    最近更新 更多