| 제목 | json curl 통신 중 해더를 붙이면 상대 서버에서 데이터를 받지 못합니다. | ||
|---|---|---|---|
| 카테고리 | PHP | ||
| 글쓴이 | g901 | 작성시각 | 2022/03/24 09:48:28 | 
|  | |||
| PHP 7.x / CI 3.x 
 cUrl 통신으로 JSON 데이터를 POST로 주고 받는 시스템을 만들고 있습니다. [보내는 서버]에서 JSON 데이터를 생성하고 cUrl을 통해 [받는 서버]로 전송을 하는데 [받는 서버]에서 데이터를 빈 Array 로 받습니다. 무엇이 문제인지 파악하지 못하여, 이것 저것 코드를 만져보다 보니, [보내는 서버]에서 
$headers = array(
        "Content-Type: application/json; charset=UTF-8",
        );
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);위 코드를 삭제하면 [받는 서버]에서 데이터를 받습니다. 다만, 받는 데이터가 Array로 받아지는데 이상한 형태로 받아집니다. 아래 코드를 첨부하오니 예상되는 문제점을 집어 주시길 부탁드립니다. ㅠㅠ 
 [보내는 서버 CODE] 
$post = array(           
    'order' => 'login',           
    'data'  => array(               
        'code'     => 1234567,
        'id'       => 1234,
        'password' => 5678
    ), 
);
$url = 'https://받는서버API';
$postData = json_encode($post,JSON_UNESCAPED_UNICODE);
$headers = array(
        "Content-Type: application/json; charset=UTF-8",
);
$ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, "{$postData}");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);       
curl_close($ch);
 [받는 서버 CODE] 
$str    = $this->input->post();
log_message('error','$str = '.json_encode($str,JSON_UNESCAPED_UNICODE)); // 1번
$str = json_decode($str,TRUE); // 2번
foreach ($str as $key => $var) {           
    log_message('error','$key = '.$key);           
    log_message('error','$var = '.$var);           
    $switch[$key] = (string) $var;       
}
[받는 서버]가 원래 받아야 되는 DATA 형태 
{"order":"login","data":{"code":"1234567","id":"1234","password":"5678"}}
 [받는 서버] 보내는 서버에서 CURLOPT_HTTPHEADER를 안보낼 경우 전송받은 DATA 형태 1번 log_message 
log_message('error','$str = '.json_encode($str,JSON_UNESCAPED_UNICODE));
$str = {"{\"order\":\"login\",\"data\":{\"code\":\"1234567\",\"id\":\"1234\",\"password\":\"5678\"}}":"","0":""}
 2번 에러 발생 json_decode() expects parameter 1 to be string, array given 
 [받는 서버] 보내는 서버에서 CURLOPT_HTTPHEADER를 보낼 경우 특별한 에러 발생 없이 데이터 전송 안됨 | |||
| 태그 | JSON,CURL,HEADER | ||
| 다음글 | ci-3.1.9버전에 PHP8.0 에서 에러 (7) | ||
| 이전글 | 다른 브라우저는 이상 없는데 ie에서 안되는 경우 (2) | ||
| 
                                변종원(웅파)
                                /
                                2022/03/24 10:27:38 /
                                추천
                                1
                             | 
| 
                                g901
                                /
                                2022/03/24 10:33:09 /
                                추천
                                0
                             아... 받을때 $this->input->post(); 가 아니라 file_get_contents('php://input'); 로 하니까 되는군요!!! 전 파일로 생성해서 보낼때만 file_get_contents를 써야 한다고 생각해버렸네요. 
 추천 주신 페이지가 이미 봤던거라 실망했었는데, 추천 주신 이유가 있겠지 하고 믿음으로 그냥 써넣어보니 바로 되네요!! 
 감사합니다!!! 복받으세요!! 
 수정내용 [받는 서버 CODE] $str = $this->input->post(); 를 
$str    = file_get_contents('php://input');로 수정 'php://input' 는 뭐 다른 데이터로 안바꾸고 그대로 넣으면 됨 
 | 
| 
                                한대승(불의회상)
                                /
                                2022/03/24 11:12:42 /
                                추천
                                0
                             ci3는 'php://input' 에 대해 $this->input->raw_input_stream 라는 랩퍼를 제공하고 있습니다. | 
| 
                                g901
                                /
                                2022/03/24 13:20:30 /
                                추천
                                0
                             한대승(불의회상) // $this->input->raw_input_stream 음... 죄송합니다만 어떻게 사용하는 건가요? ^^;;;;; 
 | 
| 
                                g901
                                /
                                2022/03/24 13:27:58 /
                                추천
                                0
                             한대승(불의회상) // 
 아~ 혹시, 
$str    = file_get_contents('php://input');대신에 $str = $this->input->raw_input_stream; 이렇게 사용하면 되는게 맞나요? 
 위처럼 하니 에러 없이 잘 작동하고 있습니다!!! 감사합니다!!! | 
| 
                                한대승(불의회상)
                                /
                                2022/03/24 13:45:48 /
                                추천
                                0
                             
                                네 맞습니다.
                             | 
참고하세요.
https://yoshikixdrum.tistory.com/188