제목 | 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