테스트 사이트 - 개발 중인 베타 버전입니다

php://input 질문드립니다 채택완료

씨메이크 3년 전 조회 4,956

allow_url_fopen = on 으로 설정 되어 있으며 PHP Version 7.4.24 입니다

서버는 데비안 10 , nginx 로 설치되어 있네요

 

도메인/shop/state  라는 폴더 내에 index.php 가 있습니다

 

index.php 내용은 

 

</p>

<p>$json = file_get_contents("php://input");

$POST = json_decode($json, true);</p>

<p>sql_query(" insert into xxx_test ( xx_time, cm ) values ( '".G5_TIME_YMDHIS."', '".$_SERVER['CONTENT_TYPE']."' ) ");</p>

<p> </p>

<p>sql_query(" insert into xxx_test ( xx_time, cm ) values ( '".G5_TIME_YMDHIS."', '".$_POST."' ) ");</p>

<p>

위처럼 확인 후 업체에서 데이터를 보낸 후 db를 확인 하면 

$_SERVER['CONTENT_TYPE']  == > "application/json;charset=UTF-8""

$POST  ==> ""  

 

위처럼 $_POST 값은 공란 입니다

 

요청을 받아야 하는 json 데이터는

{
   "StoreId": "T0022",    
}

이런식 이어야 합니다

 

그런데 업체에서 보낸  로그 값을 보면 

요청 값이

2022/02/16 07:00:51.290 [DEBUG] [05177] [apis/spiderOutApi.go:225 (OLIF/apis.SPORequestAPI)] [카드] Converted API. Path[도메인/shop/state], Body[{"StoreId":"T0022"}]

이렇게 로그가 있다는데 

 

왜 POST 에는 아무 값도 없는걸로 나올까요

 

저쪽 업체에서 이쪽으로 데이터가 아무것도 인넘어 온거던지

아니면 제쪽에서 데이터를 못읽는 거든지 어쨌든 둘중 하난데 ...

 

위 아이디를 통해

 

회원정보 검증 후

 

</p>

<p>$body_data = array(

    "ResultCode" => "0000",

    "ResultMessage" => "성공",

    "StoreId" => "T0022",

    "Name" => "홍길동",

    "UseYN" => "Y"

);



$output_data = json_encode($body_data, JSON_UNESCAPED_UNICODE);



Header('Content-Type: application/json');</p>

<p>print_r($output_data);</p>

<p>

 

위 처럼만 동일페이지에서 아이디 받고 회원 검증만 해주고 출력만 해주면 끝 입니다.

 

임의로 회원검증 데이터를 처리 해주면 문제가 없는데

json으로 아이디를 받고 해당 회원이 정상 적인 회원인지 쿼리 처리 후

데이터 반환을 해야 하는데 아이디가 안들어 오는건지 읽지를 못하는건지 ..

 

몇시간째 돌겠네요 ㅜㅜ;;;

 

 

어떤 문제일까요??

그리고 혹시 로그나 다른 데이터가 들어가 있는지 확인해 볼수 있는 방법이 있을까요?

 

 

///////////////////////////////////////////////////////////////

 

아무래도 받는 쪽.. 제쪽에서 문제가 있는것 같습니다..

다른 사이트에서 curl 로

해당 url .. 그러니까 

url = '도메인/shop/state'; 로 id를 전송할 때

도메인/shop/state/index.php  에서 

$json = file_get_contents("php://input");

 

이 부분이 동작을 안하는것 같습니다;;

 

혹시 이유를 알수 있을까요...;;

 

혹시 서버 설정 에서 뭔가를 더 해줘야 하는건가요? -->

확인해 보니 이건 아닌것 같습니다;;

해당 동일 서버의 다른 사이트에서

리턴 값을 php://input 로 받는 사이트가 있는데 여기는 동작을 잘 하고 있네요;;

 

흠 .. 뭐가 문제인지...

 

 

 

////////////////////////////////////////////

 

혹시 테스트가 가능하신 분들은  테스트 부탁 드립니다

 

</p>

<p>function get_cm_curl($data){

    

    global $g5, $config;</p>

<p>    $method = "POST";

    $url = '<a href="https://sp.cmake.work/shop/state/';// " target="_blank" rel="noopener noreferrer">https://sp.cmake.work/shop/state/';// </a>

    

    $headers = array( 

        "content-type: application/json", 

        "accept-encoding: gzip" 

    );    </p>

<p>    $ch = curl_init($url); 

    $timeout = 900; // 900 Seconds = 15 Minutes     

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);   

    curl_setopt($ch, CURLOPT_HEADER, 0); 

    curl_setopt($ch, CURLOPT_TIMEOUT, 30); 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);      // POST DATA

    curl_setopt($ch, CURLOPT_POST, true);     </p>

<p>    

    $response = curl_exec($ch);

    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    $error = curl_error($ch);

    curl_close($ch);</p>

<p>    return $response;

}</p>

<p> </p>

<p> </p>

<p> </p>

<p>$body_data = array(

    "StoreId" => "T0022"

);

$json = get_cm_curl($body_data);

$_POST = json_decode($json, true);</p>

<p> </p>

<p>print_r($json);</p>

<p>   </p>

<p>

 

print_r에서 {"StoreId":null} NULL 이 나오면 안됩니다 ;;

해당서버에서 왜 값을 못받는지 이유를 알려 주시면 감사하겠습니다 ㅜㅜ;;

 

 
댓글을 작성하려면 로그인이 필요합니다.

답변 4개

채택된 답변
+20 포인트
3년 전

index.php에서 json처리를 하려면 보내는 쪽에서 json데이터를 보내야죠

 

$body_data = json_encode($body_data); //<---추가
$json = get_cm_curl($body_data);

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

씨메이크
3년 전
아... 감사합니다 받는 쪽에만 신경을 썼더니 ...ㅜㅜ ;;; 잘 됩니다 정말 감사합니다

댓글을 작성하려면 로그인이 필요합니다.

B
3년 전

받는 쪽이면 아래처럼 데이터 저장해서 파일 살펴보세요.

file_put_contents('./log.txt', file_get_contents('php://input').PHP_EOL, FILE_APPEND);

 

* 참고로 enctype="multipart/form-data"와 같이 사용 불가.

- https://www.php.net/manual/en/wrappers.php.php#wrappers.php.input

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

씨메이크
3년 전
빈 값으로 들어 오고 있는것 같습니다..ㅜㅜ
줄바꿈만 있고 아이디 값은 하나도 없습니다.. ㅜㅜ
아.. 이해를 못하겠네요..
폴더권한도 755 707 777 로 다 줘 봤고 ...
서버에 포트도 열어줄건 다 열어 놓은것 같은데..
도대체 뭐가 문제인지 모르겠습니다 ^^;;;
B
BiHon
3년 전
원격으로 볼 수 있을까요? '-')?
씨메이크
3년 전
아~ 감사합니다 해결 되었습니다. 관심 가져주셔서 감사드립니다. 보내는쪽에 json 변환 문제였습니다 ㅜㅜ;;

댓글을 작성하려면 로그인이 필요합니다.

테스트 하시면서 헷갈리실것 같아 https://sp.cmake.work/shop/state/" target="_blank">https://sp.cmake.work/shop/state/ 의 내용을 다시 수정했습니다

 

</p>

<p>$json = file_get_contents('php://input');

$data = json_decode($json, true);</p>

<p>$StoreId = 'NULL';

if(isset($data['StoreId'])){

    $StoreId = $data['StoreId'];

}</p>

<p>sql_query(" insert into xxx_test ( xx_time, cm, type, ip ) values ( '".G5_TIME_YMDHIS."', '".$_SERVER['CONTENT_TYPE']."', '아이디 json type', '".$_SERVER["REMOTE_ADDR"]."' ) ");

sql_query(" insert into xxx_test ( xx_time, cm, type, ip ) values ( '".G5_TIME_YMDHIS."', '".print_r($data, true)."' , '아이디 array - {$StoreId}', '".$_SERVER["REMOTE_ADDR"]."' ) ");</p>

<p>/* $body_id = array(

    "StoreId" => $StoreId

); */

/* $output_id = json_encode($body_id, JSON_UNESCAPED_UNICODE);

sql_query(" insert into xxx_test ( xx_time, cm ) values ( '".G5_TIME_YMDHIS."', '{$output_id}' ) "); */</p>

<p>if($StoreId == 'NULL'){

    $body_data = array(

        "ResultCode" => "400",

        "ResultMessage" => "실패",

        "StoreId" => $StoreId,

        "StoreName" => "회원정보없음",

        "UseYN" => "N"

    );

}else{

    $body_data = array(

        "ResultCode" => "0000",

        "ResultMessage" => "성공",

        "StoreId" => $StoreId,

        "StoreName" => "테스트매장",

        "UseYN" => "Y"

    );

}

/* $body_data = array(

    "StoreId" => "T00022"

);  */

$output_data = json_encode($body_data, JSON_UNESCAPED_UNICODE);

sql_query(" insert into xxx_test ( xx_time, cm ) values ( '".G5_TIME_YMDHIS."', '{$output_data}' ) ");</p>

<p>Header('Content-Type: application/json');

print_r($output_data);</p>

<p>

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

B
3년 전

https://sp.cmake.work/shop/state/ 에 직접 접속, 아래처럼 출력됩니다.

{"StoreId":null}
{"ResultCode":"0000","ResultMessage":"성공","StoreId":"T0022","StoreName":"테스트매장","UseYN":"Y"}</p>

<p>

애초에 잘못된 결과값이라 json_decode()가 되지 않으니 CMAKE에 요청해야겠네요.

업체에서 본인들은 문제 없다, 로그 잘 찍힌다, 수정할 것 없다 그러면 그냥 아래처럼 잘라쓰면 되겠네요.

</p>

<p>$json = get_cm_curl($body_data);

list(, $json) = explode('
', $json, 2);

$res = json_decode($json, true);

print_r($res);</p>

<p>

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

씨메이크
3년 전
아.. 밑에 성공 값은 file_get_contents('php://input'); 으로 상점 아이디가 넘어 왔을 때 회원정보에서
아이디를 확인 후 정보가 확인되면 성공값이 그렇게 나와야 한다는 예제 값입니다 ^^;
헷갈리실것 같아 https://sp.cmake.work/shop/state/ 내용을 수정했습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인