2

단순히 토큰을 POST하는 자동 가입 API를 작성하려고합니다. Sinatra에서 매우 쉽게이 작업을 수행 할 수 있습니다 (POST 된 JSON을 AWS에서 렌더링). Express에서 어려움을 겪고있는 것 같습니다. 내가 1000X 조합을 시도했지만 그것은 단지 내가 바보짓 한 무언가라고 확신한다.AWS SNS webservice subscription - 명시 적 문제, sinatra 예

# application.rb 

require 'rubygems' 
require 'sinatra' 
require 'json' 

set :port, 8081 

post '/webservice/cloudwatch' do 
    content_type :json 
    puts "Body: " + request.body.read 
end 

로그 : 여기

- -> /webservice/cloudwatch 
Body: { 
    "Type" : "SubscriptionConfirmation", 
    "MessageId" : "OMIT", 
    "Token" : "OMIT", 
    "TopicArn" : "OMIT", 
    "Message" : "OMIT", 
    "SubscribeURL" : "OMIT", 
    "Timestamp" : "2012-02-28T21:28:02.082Z", 
    "SignatureVersion" : "1", 
    "Signature" : "OMIT", 
    "SigningCertURL" : "OMIT" 
} 

를 익스프레스 웹 서버입니다 :

var express, app, stache; 
express = require("express"), app = express.createServer(); 
app.configure(function() { 
    app.use(express.methodOverride()); 
    app.use(express.bodyParser()); 
    app.use(app.router); 
    app.set("view options", { 
    layout: false 
    }); 
    app.use(express.errorHandler({ 
    dumpExceptions: true, 
    showStack: true 
    })); 
}); 
app.post("/webservice/cloudwatch", function (request, response) { 
    request.accepts('application/json'); 
    console.log("post body: " + JSON.stringify(request.params)); 
    console.log("post body: " + JSON.stringify(request.body.read)); 
}); 
app.listen(8081); 

기록합니다

post body: [] 
post body: undefined 
,536,913을 여기

은시나 웹 서버입니다

도와주세요!

+0

대신'에'console.log' 일을 : request.rawbody에게로

var rawbody = function(req, res, next) { var data = ''; req.setEncoding('utf8'); req.on('data', function(chunk) { data += chunk; }); req.on('end', function() { req.rawBody = data; next(); }); }; app.use(rawbody); app.use(express.bodyParser()); 

감사 로깅 시도 어떤 속성에 들어 있는지 확인하십시오. – Marshall

+0

console.dir (request.body); 이 로그 {} –

+0

console.dir (request.body.read); 이 로그는 정의되지 않음 –

답변

2

웹 서비스 테스트에 사용하는 요청은 무엇입니까?

curl -H "Content-Type: application/json" -d '{"Type":"SubscriptionConfirmation","MessageId":"OMIT","Token":"OMIT","TopicArn":"OMIT","Message":"OMIT","SubscribeURL":"OMIT","Timestamp":"2012-02-28T21:28:02.082Z","SignatureVersion":"1","Signature":"OMIT","SigningCertURL":"OMIT"}' http://localhost:8081/webservice/cloudwatch 

가 (응용 프로그램/JSON으로 설정 콘텐츠 형식을 알)와 console.log console.log(request.body);로하는 당신에게 예상되는 결과를 제공한다 변경 : 이렇게. bodyParser 메소드는 request.body을 올바르게 채우기 위해 content-type을 알아야합니다.

2

amazon에서 http 포스트 요청을 끝점으로 보내면 콘텐츠 형식이 지정되지 않습니다. 이는 응답에 따라 알려진 문제입니다.

그동안 내가 테스트 해본 매우 일시적인 해결 방법이 있습니다. 익스프레스 플러그인에서 bodyParser.js 파일을 수정했습니다. 특히, mime 함수에 if 체크를 추가하여 필요에 따라 콘텐츠 유형이 application/json 인 것처럼 위장 할 수 있습니다. (확인 bodyParser이 rawbody 후 제공하게) 당신의 급행 서버에 다음을 추가

function mime(req) { 
    if(req.headers['x-amz-sns-message-type'] == 'SubscriptionConfirmation' && !req.headers.hasOwnProperty['content-type']) { 
     req.headers['content-type'] = 'application/json'; 
    } 

    var str = req.headers['content-type'] || ''; 
    return str.split(';')[0]; 
} 
0

: 여기

수정 된 마임 기능입니다. request.body``에`console.dir`을 수행하려고 request.body.read` Expressjs raw body