php://input 질문드립니다
본문
allow_url_fopen = on 으로 설정 되어 있으며
PHP Version 7.4.24 입니다
서버는 데비안 10 , nginx 로 설치되어 있네요
도메인/shop/state 라는 폴더 내에 index.php 가 있습니다
index.php 내용은
$json = file_get_contents("php://input");
$POST = json_decode($json, true);
sql_query(" insert into xxx_test ( xx_time, cm ) values ( '".G5_TIME_YMDHIS."', '".$_SERVER['CONTENT_TYPE']."' ) ");
sql_query(" insert into xxx_test ( xx_time, cm ) values ( '".G5_TIME_YMDHIS."', '".$_POST."' ) ");
위처럼 확인 후 업체에서 데이터를 보낸 후 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 에는 아무 값도 없는걸로 나올까요
저쪽 업체에서 이쪽으로 데이터가 아무것도 인넘어 온거던지
아니면 제쪽에서 데이터를 못읽는 거든지 어쨌든 둘중 하난데 ...
위 아이디를 통해
회원정보 검증 후
$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');
print_r($output_data);
위 처럼만 동일페이지에서 아이디 받고 회원 검증만 해주고 출력만 해주면 끝 입니다.
임의로 회원검증 데이터를 처리 해주면 문제가 없는데
json으로 아이디를 받고 해당 회원이 정상 적인 회원인지 쿼리 처리 후
데이터 반환을 해야 하는데 아이디가 안들어 오는건지 읽지를 못하는건지 ..
몇시간째 돌겠네요 ㅜㅜ;;;
어떤 문제일까요??
그리고 혹시 로그나 다른 데이터가 들어가 있는지 확인해 볼수 있는 방법이 있을까요?
///////////////////////////////////////////////////////////////
아무래도 받는 쪽.. 제쪽에서 문제가 있는것 같습니다..
다른 사이트에서 curl 로
해당 url .. 그러니까
url = '도메인/shop/state'; 로 id를 전송할 때
도메인/shop/state/index.php 에서
$json = file_get_contents("php://input");
이 부분이 동작을 안하는것 같습니다;;
혹시 이유를 알수 있을까요...;;
혹시 서버 설정 에서 뭔가를 더 해줘야 하는건가요? -->
확인해 보니 이건 아닌것 같습니다;;
해당 동일 서버의 다른 사이트에서
리턴 값을 php://input 로 받는 사이트가 있는데 여기는 동작을 잘 하고 있네요;;
흠 .. 뭐가 문제인지...
////////////////////////////////////////////
혹시 테스트가 가능하신 분들은 테스트 부탁 드립니다
function get_cm_curl($data){
global $g5, $config;
$method = "POST";
$url = 'https://sp.cmake.work/shop/state/';//
$headers = array(
"content-type: application/json",
"accept-encoding: gzip"
);
$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);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
return $response;
}
$body_data = array(
"StoreId" => "T0022"
);
$json = get_cm_curl($body_data);
$_POST = json_decode($json, true);
print_r($json);
print_r에서 {"StoreId":null} NULL 이 나오면 안됩니다 ;;
해당서버에서 왜 값을 못받는지 이유를 알려 주시면 감사하겠습니다 ㅜㅜ;;
!-->!-->!-->
답변 4
index.php에서 json처리를 하려면 보내는 쪽에서 json데이터를 보내야죠
$body_data = json_encode($body_data); //<---추가
$json = get_cm_curl($body_data);
https://sp.cmake.work/shop/state/ 에 직접 접속, 아래처럼 출력됩니다.
{"StoreId":null}<br>{"ResultCode":"0000","ResultMessage":"성공","StoreId":"T0022","StoreName":"테스트매장","UseYN":"Y"}
애초에 잘못된 결과값이라 json_decode()가 되지 않으니 CMAKE에 요청해야겠네요.
업체에서 본인들은 문제 없다, 로그 잘 찍힌다, 수정할 것 없다 그러면 그냥 아래처럼 잘라쓰면 되겠네요.
$json = get_cm_curl($body_data);
list(, $json) = explode('<br>', $json, 2);
$res = json_decode($json, true);
print_r($res);
테스트 하시면서 헷갈리실것 같아 https://sp.cmake.work/shop/state/ 의 내용을 다시 수정했습니다
$json = file_get_contents('php://input');
$data = json_decode($json, true);
$StoreId = 'NULL';
if(isset($data['StoreId'])){
$StoreId = $data['StoreId'];
}
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"]."' ) ");
/* $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}' ) "); */
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}' ) ");
Header('Content-Type: application/json');
print_r($output_data);
받는 쪽이면 아래처럼 데이터 저장해서 파일 살펴보세요.
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