2014-01-29 2 views
9

Node.js 응용 프로그램의 일부 데이터를 PHP 스크립트로 POST하려고합니다. 당분간 나는 개념 증명을 구축하고 있지만 실제 데이터를 PHP 측에 넘길 수는 없습니다. 요청이 끝나고 200을 다시 얻지 만 PHP는 $ _POST 배열이 비어 있다고 생각합니다.Node.js에서 PHP로 POST

// simple end point just for testing 

exports.testPost = function(request, response) { 
    data = request.body.data; 

    postToPHP(data); 

    response.end(data); 
} 

function postToPHP (data) { 
    var http = require('http'); 

    var options = { 
     host : 'localhost', 
     port : 8050, 
     path : '/machines/test/index.php', 
     method : 'POST', 
     headers : { 
      'Content-Type' : 'application/json', 
      'Content-Length' : Buffer.byteLength(data) 
     } 
    }; 

    var buffer = ""; 

    var reqPost = http.request(options, function(res) { 
     console.log("statusCode: ", res.statusCode); 

     res.on('data', function(d) { 
      console.info('POST Result:\n'); 
      //process.stdout.write(d); 
      buffer = buffer+data; 
      console.info('\n\nPOST completed'); 

     }); 

     res.on('end', function() { 
      console.log(buffer); 
     }); 
    }); 

    console.log("before write: "+data); 

    reqPost.write(data); 
    reqPost.end(); 

} 

가 다시 요청이 로컬 호스트로 만드는 : 8050/기계/테스트/index.php를하지만 $ _POST의 위해서 var_dump를 할 때 빈 배열

여기 내 노드 코드입니다.

[29-Jan-2014 21:12:44] array(0) { 

} 

.write() 메서드로 뭔가 잘못하고있는 것으로 추측됩니다. 그러나 나는 무엇을 알아낼 수 없습니다. 내가 누락하거나 잘못하고있는 것에 대한 모든 의견은 크게 감사 할 것입니다.

* 업데이트 : 의견의 일부로서

사용하여 나타냅니다 file_get_contents ('PHP : // 입력'); PHP 측에서 데이터를 얻으려고 노력하지만 여전히 $ _POST 배열에 직접 액세스하는 것을 선호합니다.

+1

가능한 중복 PHP에서 JSON POST에서 HTTP 요청 본문 읽기] (http://stackoverflow.com/questions/7047870/issue-reading-http-request-body-from-a-json-post-in-php) – Quentin

+0

@Quentin Nope , 기필코 아니다. JSON을 PHP로 전달하려고 시도했지만 여전히 $ _POST 배열이 비어 있습니다. –

+1

"JSON 이외의"인코딩 된 application/x-www-form-urlencoded 데이터입니까? '$ _POST'를 채우지 않아야하는 코드 만 보았습니다. – Quentin

답변

15

Content-Type: application/json으로 데이터를 전송 했으므로 php 확장자가없는 한 php가 _GET 및 _POST와 같은 전역에 json을 읽는 방법을 모르기 때문에 원시 입력을 읽어야합니다.

당신은 당신보다 데이터가 전역으로 분석하여 조치 할 수 있도록 Content-Type:application/x-www-form-urlencoded로 전송할 수있는 이름 - 값 쌍의 쿼리 문자열로 객체를 구문 분석 querystring 라이브러리를 사용할 수 있습니다

var data = { 
    var1:"something", 
    var2:"something else" 
}; 
var querystring = require("querystring"); 
var qs = querystring.stringify(data); 
var qslength = qs.length; 
var options = { 
    hostname: "example.com", 
    port: 80, 
    path: "some.php", 
    method: 'POST', 
    headers:{ 
     'Content-Type': 'application/x-www-form-urlencoded', 
     'Content-Length': qslength 
    } 
}; 

var buffer = ""; 
var req = http.request(options, function(res) { 
    res.on('data', function (chunk) { 
     buffer+=chunk; 
    }); 
    res.on('end', function() { 
     console.log(buffer); 
    }); 
}); 

req.write(qs); 
req.end(); 
[문제의
+0

"[{{" name ":"test1 ","value ":"10 "}, {"name ":"test2 ","value ":"20 "}]"? 분명한 이유 때문에 문자열을 조율하는 q 도우미를 얻을 수 없습니다. –

+1

@NicholasKreidberg, php'JSON.parse (buffer)'의 데이터를 의미한다면, 그렇지 않으면 가변 데이터에 해당 문자열이 포함되어 있다는 것을 의미하는 경우 객체에 구문 분석을 먼저 수행하십시오.'data = {myArray : JSON.parse (data)};'stringify에 전달한 다음 PHP에서 $ _POST [ 'myArray']'를 캡처합니다. –

+0

그게 가장 도움이되었다! HTTPS를 통해 작동하는 동일한 예제를 얻으려면 무엇이 필요합니까? –

관련 문제