CI 묻고 답하기

제목 ajax + json
글쓴이 구름정원 작성시각 2013/07/10 12:52:17
댓글 : 18 추천 : 0 스크랩 : 0 조회수 : 25164   RSS
 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}

 다음글 포럼소스질문 (4)
 이전글 데이터 베이스 쿼리가 안먹히네요 (5)

댓글

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

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

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

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

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

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

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

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

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

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

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

html 로 보내서 리턴 시키면

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

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

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

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

$.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);
});
형태로 쓰는걸 선호하는지라.. 
혹여 참고가 되길 바래요.
pithecus / 2013/07/10 17:22:10 / 추천 0
500 에러면 php 쪽에서 에러가 발생했다는 의미이니 php 에러 로그에 답이 있을것 같습니다.
구름정원 / 2013/07/10 18:12:54 / 추천 0
dataType 이 'json'이 아닌 'html'이면 아무 문제 없습니다. 오직 json일때만 문제에요. ㅠㅠ

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

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

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

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

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

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


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




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

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

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

csrf 켜놨나 보세요

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


echo 말고 

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

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

모두 고맙습니다. ^^