2014-12-19 5 views
1

간단한 RESTful API를 위해 iron-router와 함께 meteor를 사용하려고하고 있는데, 헤더 유형이 'Content- 유형 : application/json '그러면 var thisVar = this.request.body.myKey을 사용하여 http 요청의 본문을 구문 분석 할 수 있습니다. 그러나 콘텐츠 유형을 지정하지 않으면 기본값은 application/x-www-form-urlencoded이며 본문은 그렇지 않습니다. json으로 구문 분석됩니다.meteor iron-router 헤더 유형이 json이 아님

제 질문은 어떻게 JSON으로 콘텐츠를 JSON으로 변환 할 수 있습니까? 이제 대부분의 사람들은 "POST 요청에서 json으로 콘텐츠 유형을 변경하는 것만으로는 안됩니다"라고 생각할 수도 있습니다. 글쎄, 그 대답은 제가 POST를 제어하지 않는다는 것입니다, 이것은 타사 소프트웨어입니다. 개선 요청을 추가 할 수는 있지만 몇 달이 걸릴 것이며 앞으로도 발생할 수 없습니다.

그래서, 그러므로 내 질문에 다시이다 : 나는 쉽게 형식 var thisVar = this.request.body.myKey

편집

를 사용하여 분석 할 수 있도록 내 철 - 라우터 내에서 내가 JSON으로 내 몸의 콘텐츠 유형을 '변환'수

내가 철저하게 설명하자면, 철저한 작업을하는 RESTful API가 이미있다. 일부 json 데이터와 함께 curl과 POST를 사용하고 내용 유형을 json으로 지정하면 curl -XPOST -H "Content-Type:application/json" -d"{\"myKey\":\"myValue\"}" http://localhost:3000/api/insert 내 경로에서 POST를 처리하기 위해 var thisVar = this.request.body.myKey으로 본문을 구문 분석 한 다음 내 mongodb 등에 삽입 할 수 있습니다. 그러나

, 클라이언트는 콘텐츠 형식을 지정하지 않고 게시되어 있으므로 기본 응용 프로그램/x-www-form-urlencoded를 나는 다음과 같은 코드를 사용할 때 너무 var thisVar = this.request.body.myKey이 값 thisVar이 정의되지 그래서 쉽게 구문 분석 할 수있다 HTTP 요청의 본문

의미가 있습니까? 철 - 라우터 편안한 API를 만들기

답변

2

예, 나는 내 자신의 질문에 대답하고 그러나 희망은 거기에 사람을 도움이 될 것입니다.

  1. 백 슬래시는 따옴표
  2. 을의 탈출 :

    는 HTTP 응답을 인쇄하는 일련의 후, 나는 내 원시 데이터가 JSON 객체로 해석되는 것을 방지 다음과 같은 특성을 가지고 있다는 것을 발견

  3. 'JSON.stringified'이후의 전체 원시 문자열은 큰 따옴표로 묶인 키이고 기본적으로 빈 값입니다.

예 : {"{ \"myKey\" : \"ValueA\"}":""} I는 # 1, # 2를 수정하도록하려면 string.replace() 함수를 사용

.

예 (아래 예제 코드 참조) { "myKey" : "ValueA"}

json으로 문자열을() 수정 # 1과 # 2는 내가 다음 JSON.parse을 할 수 적용한 후.

여기 수정 # 1과 # 2 내 코드입니다 :

Router.route('/api/insert/test', function(){ 

this.response.statusCode = 200; 

this.response.setHeader("Content-Type", "application/json"); 

this.response.setHeader("Access-Control-Allow-Origin", "*"); 

this.response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 



var re = /\\/g; 

var re2 = /\{\"/g; 

var re3 = /\":\"\"\}/g; 

var json_str = JSON.stringify(this.request.body); 

var json_str_after_re = json_str.replace(re, '').replace(re2, '').replace(re3, ''); 

var json = JSON.parse(json_str_after_re); 



this.response.end('this is ' + json_str_after_re + ' and value is ' + json.myKey); 

}, {where: 'server'}); 
+0

왜 시체를 JSON.stringify'ing, 그냥 regexes를 사용하여 아주 이상한 방식으로이를 취소하려면? – ePirat

1

은 매우 간단합니다 :

Router.route('/webhooks/stripe', { where: 'server' }) 
    .get(function() { 
    // GET /webhooks/stripe 
}) 
.post(function() { 
    // POST /webhooks/stripe 
}) 
.put(function() { 
    // PUT /webhooks/stripe 
}) 

Source

+0

감사 다니엘, 이것은 내가 뭘하지만 .post 기능에 내가 몸'this.request을 구문 분석하는 데 문제가 정확히 무엇인가 .body' 클라이언트의 POST에 내용 유형이 지정되지 않았기 때문에. – harleygolfguy

+0

나는 ... 나는 스마트 폰 atm 만 가지고있어 아무 것도 시도 할 수 없지만 this.request.body는 name = value & name2 = value2와 같은 쿼리 문자열이 될 수 있다고 상상할 수있다. URL 인코딩 됨. 값을 받기 전에 이것을 디코딩해야합니다 : http://stackoverflow.com/questions/4671985/how-to-convert-an-x-www-form-urlencoded-string-to-json –

+0

내 경우 this.request .body는 실제로 json 형식의 텍스트입니다. " key": "value"} " – harleygolfguy

관련 문제