질문 Q #10647
ajax + json
구름정원 2013-07-10 12:52:17
 CI에서 ajax로 json 주고받기를 구현하고 있는데요.
url이 일반 PHP 파일인 경우는 잘 되는데, 콘트롤러로 하면 안되네요.

CI에서 따로 호출하는 방법이 있는 건가요? 몇일 째 test해보고 검색해보는데 안되네요.

view 소스 입니다.
소스에서 url을 보시면 아시겟지만 웹루트에 만든 /json2.php일 경우는 'success'를 보여주는데요.
콘트롤러에 만든 함수인 /json_data/json2_test 로 하면 fail이 되네요.그리고 크롬 개발자 도구로 보면 500 Internal Sever error  가 발생합니다.

하지만 
브라우져에서 /json_data/json2_test 를 호출하면 이렇게 제대로 보입니다. ㅠㅠ
{"hanja": "1", "idx": 0}


아시는 분, 제발 도움좀 주세요.

view 소스입니다.
        <input type="text" id="msg" />
        <input type="button" value="get result" id="getResult" />
        <script>
            $('#getResult').click( function() {
                $('#result').html('');
                $.ajax({
                    type:'POST',
                    url:'/json2.php', 
                    //url:'/json_data/json2_test', 
                    dataType:'json',
                    success:function(result) {
                     alert('success');
                   },
       error:function(msg) {
         alert('fail');
       }
                    
                });
            })
        </script>

콘트롤러 소스입니다.
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');

class Json_data extends CI_Controller {
 function __construct() {
  parent::__construct();
 }
 
 function json2_test() {
  echo '{"hanja": "1", "idx": 0}';
 }
}

/json2.php 의 소스입니다.
{"hanja": "1","idx": 0}

답변 18
#1 변종원(웅파) 2013-07-10 12:55:49
컨트롤러 소스를 봐야 답을 드리죠? 헤더가 선언된건지 다른 문제가 있는지..
#2 구름정원 2013-07-10 13:47:19
 앗, 웅파님 죄송합니다.

콘트롤러 소스는 필요 없을 거라 생각해버렸네요.

수정했습니다.~
참고로 url을 /json_data/json2_test 로 하면 fail이 되고, 크롬 개발자 도구로 보면 500 Internal Sever error 가 발생합니다.
#3 한대승(불의회상) 2013-07-10 14:09:55
500 Internal Sever error 면 당연히 fail 이겠죠.

웹 브라우져 에서 /json_data/json2_test 를 먼저 호출해 보세요.
뭐가 보이는지...

#4 구름정원 2013-07-10 14:13:48
 네, 브라우져에서 /json_data/json2_test 를 호출하면 이렇게 제대로 보입니다. ㅠㅠ

{"hanja": "1", "idx": 0}
#5 한대승(불의회상) 2013-07-10 15:11:10
^^ 그럼 오리무중 인데요..
아래처럼 해 보세요.
도움이 되실지....
$this->output->set_content_type('application/json');

#6 구름정원 2013-07-10 15:31:38
 콘트롤러에서 
function json2_test() {
$this->output->set_content_type('application/json');
echo '{"hanja": "1", "idx": 0}';
}

이렇게 추가해봤느데요. 역시 안되네요.

그런데 다른 분들은 ajax에서 url에 콘트롤러를 호출해도 이상없이 잘들 되시는 건가요? 

혹시 지금 개발중인 사이트에서 결과를 직접 보고 싶으시다면 쪽지로 보내드릴께요.
#7 한대승(불의회상) 2013-07-10 16:11:53
ajax개발시 아무 문제 없었습니다. ^^
에러 로그를 추적해 보세요.
#8 risa 2013-07-10 16:43:56
 json  컨트롤이 어렵다면

먼저 html 로 해서 단순히 값을 echo 로 찍어 보는것도 디버그 방법중 하나입니다.

html 로 보내서 리턴 시키면

정상으로 컨트롤러가 동작 한다면 에코 값이 나올테고

무언가 에러가 있다면 에러 메세지를 찍어서 보내 줍니다.

그래도 안되면 의심 되는 곳에 exit; 찍어가면서 원인을 찾아 보세요.

보통 조금만한 실수가 500에러를 불르죠...
#9 미스터디 2013-07-10 17:11:51
제 실력으로 이런말 올리긴 부끄럽지만,

$.ajax({
url: "/json_data/json2_test",
}).done(function(v) {
alert(v);
});

형태로 먼저 값이 제대로 읽히는지 봐야할지도 모르겠네요.
이게 안되면 ajax에서 저 url 자체를 읽지 못하는거니... 
애초에 url 문제일 수도 있지 않을까요?

참고로 전 json으로 받는건..
$.post(url, {param:p}, function(v){
  var jdata = $.parseJSON(v);
});
형태로 쓰는걸 선호하는지라.. 
혹여 참고가 되길 바래요.
#10 pithecus 2013-07-10 17:22:10
500 에러면 php 쪽에서 에러가 발생했다는 의미이니 php 에러 로그에 답이 있을것 같습니다.
#11 구름정원 2013-07-10 18:12:54
dataType 이 'json'이 아닌 'html'이면 아무 문제 없습니다. 오직 json일때만 문제에요. ㅠㅠ

제가 확인할 수 있는 로그는 모두 확인해 봤습니다.
확인해볼만한 로그를 좀 알려주세요. 제가 php 개발자이긴 하지만 제대로 공부하고 하는게 아니라서.
구체적인 행동지침을 알려주시면 고맙겠습니다. ㅠㅠ
#12 2013-07-10 18:25:57
 일단 url에 직접 접속해서 출력되는 데이터를 확인해서 본인이 원하는 값과 동일하게 나오는지

확인을 해보시고 (소스뷰로 실제 출력된 내용 그대로를 한번 보시는 것이..)

그리고 헤더값에 Content-Type이 정상적으로 json으로 변경되어 있는지 확인 

그리고 혹시 모르니 csrf 값을 던져줘야 하는지도 확인.

그래도 안되면 ajax에서 실제로 받아온 값이 어떤것인지 출력해서 확인 

(이부분은 alert을 써보시고 만약 텍스트가 아닌 object로 받아왔다면
object를 alert으로 뿌려주는 소스 구해서 적용하신 후 해보셔도 됩니다.)


지금 생각나는 것은 이정도가 되네요




dataType 이 'json'이 아닌 'html'이면 아무 문제 없습니다. 오직 json일때만 문제에요. ㅠㅠ

이부분의 경우 출력되는 내용은 동일하지만 헤더만 json과 html의 차이라는 것인가요?

#13 구름정원 2013-07-10 18:40:30
 음. dataType이 html 일 경우는 url에서 출력한(echo) data를 그대로 return 합니다.
그런데 dataType이 json일 경우는 무조건 error로 가서 'fail'을 출력합니다.
#14 케이든 2013-07-11 08:28:44
post인거 보니

csrf 켜놨나 보세요

아닌데 그럼 dataType 상관없이 다 500뱉어야 하는데 ㅋㅋ


echo 말고 

$this->output->set_output($json);

해보세요
#15 구름정원 2013-07-11 09:49:12
 $this->output->set_output($json); 도 역시 500 error네요.
휴. 이제 포기할려구요. ㅠㅠ
개발시간이 촉박한데 여기 계속 매달려 있을 수가 없네요. 
일단 데모버전이라도 만든 다음에 다시 시도해봐야 겠네요.

모두 고맙습니다. ^^
#16 구름정원 2013-07-11 10:08:43
 아, 포기할려고 했는데. jquery autocomplete에서 json으로 주고 받는건 또 되더라구요. ㅠㅠ

그래서 jquery.ui.autocomplete.js 에 있는대로 다시한번만 test 해보려고 시도했더니 되네요. ㅠㅠ

type='POST' 를 지우고 했더니 잘 되더라구요. 결국 ''GET'으러 넘겨야 했던 거네요. ㅠㅠ;;
#17 2013-07-12 18:43:01
안녕하세요..
저도 이부분때문에 많이 애먹었었는데.. 
이경우에도 해당되는지는 모르겠지만 .. 
get으로 데이터 보낼때는 csrf 값을 안넘겨도 되나
post로 데이터를 보낼때는 csrf 값도 같이 넘겨줘야 하더라고요..
수고하세요 ^^;; 
#18 구름정원 2013-07-19 15:05:48
 옴.. csrf 값이 문제가 되는 군요. 감사합니다.
일단 모든 소스를 get으로 처리했습니다.
이 프로젝트 끝나면 post로 넘기면서 csrf값 넘기는 것도 test해봐야 겠네요.
고맙습니다~