2

我一直致力于订阅,以便在收到电子邮件时通知我的应用程序。为了激活订阅,我向https://graph.microsoft.com/v1.0/subscriptions. 每当我发送请求时,我都会收到以下错误(请注意,从 Graph Explorer 尝试时,这工作正常):

response => {
    "error"=> {
        "code"=>"InvalidRequest", 
        "message"=>"Server could not process subscription creation payload.",
        "innerError"=> {
            "request-id"=>"e4a9aef5-89b0-4d9c-ac11-01e0c188ceee", 
            "date"=>"2019-11-07T13:15:50"
        }}}

代码示例:

GRAPH_HOST = 'https://graph.microsoft.com'.freeze

def mail_noti token

    query = { 
        "changeType": "created,updated",
        "notificationUrl": "https://0d9fdb76.ngrok.io/calendar/notif_sub",
        "resource": "me/mailFolders('Inbox')/messages",
        "clientState": "secretClientValue",
        "expirationDateTime": "2019-11-08T18:23:45.9356913Z",
        "Authorization": "Bearer #{token}",
        "Accept": 'application/json'
    }

    headers = {
        Authorization: "Bearer #{token}",
        Accept: 'application/json'
    }

    endpoint = '/v1.0/subscriptions'

    binding.pry

    a =  HTTParty.post("#{GRAPH_HOST}#{endpoint}", body: query, headers: headers)
end
4

2 回答 2

1

body需要采用格式application/json,但您将其发送为application/x-www-form-urlencoded. 您需要使用.to_json

HTTParty.post("#{GRAPH_HOST}#{endpoint}",
    :body => {
        "changeType": "created,updated",
        "notificationUrl": "https://0d9fdb76.ngrok.io/calendar/notif_sub",
        "resource": "me/mailFolders('Inbox')/messages",
        "clientState": "secretClientValue",
        "expirationDateTime": "2019-11-08T18:23:45.9356913Z",
        "Authorization": "Bearer #{token}",
        "Accept": 'application/json' 
    }.to_json,
    :headers => {
        Authorization: "Bearer #{token}",
        Accept: 'application/json',
        'Content-Type' => 'application/json'
    })
于 2019-11-07T14:52:48.353 回答
-1

对我有用的最终有效负载结构:

HTTParty.post("#{GRAPH_HOST}#{endpoint}", 
                    body:  {
                      expirationDateTime: "2019-11-09T18:23:45.9356913Z",
                      changeType: "created,updated",
                      resource: "me/mailFolders('Inbox')/messages",
                      notificationUrl: "https://e44e6608.ngrok.io/calendar/notif_sub",
                      clientState: "secretClientValue"
                    }.to_json, 
                    headers: {
                      Authorization: "Bearer #{token}",
                      Accept: 'application/json',
                      'Content-Type' => 'application/json'
                    }
                )

PS:每当发送有效负载时出现问题,请确保您遵循以下步骤

  • 检查您的标头是否正确,尤其是“Content-Type”和“Authorization”(如果您发送直接http请求,您必须添加“Key”:“Authorization”和“Value”:Bearer #{token})
  • 检查您是否正在发送“正文”密钥
  • 检查您是否在“正文”下为该 API 发送所有必要的密钥
于 2019-11-08T11:54:37.507 回答