2013-06-12 1 views
1

저는 Zend Framework로 빌드 된 API에 대해 POST 요청을하기 위해 ajax를 사용하고 있습니다. API가 성공 JSON 메시지를 반환하고 있지만 AJAX는이를 오류로 읽습니다.Ajax는 zend rest controller에서 에러로 성공을 읽습니다.

나는 약 6 개의 게시물을 읽고 그들의 솔루션을 구현했습니다. 아무것도 도움이되지 않습니다. 내가 응답 코드와 콘텐츠 형식이 올바르게 설정되어 있는지 확인하기 위해 찰스를 사용하고있어 API

class LeadController extends Zend_Rest_Controller 
{ 
    public function init() 
    { 
     $this->_helper->viewRenderer->setNoRender(true); 
    } 

    public function postAction() 
    { 
     $this->getResponse() 
      ->setHttpResponseCode(201) 
      ->setHeader('Cache-Control','no-cache', true) 
      ->setHeader('Content-Type', 'application/json', TRUE) 
      ->setHeader('charset', 'utf-8', TRUE) 
      ->appendBody(json_encode(array('results' => 'success'))); 
      return; 
    } 
} 

에서

내 젠드 컨트롤러.

다음은 유효성을 확인한 JSON 응답입니다. 성공 함수가 절대 호출되지됩니다

$.ajax({ 
    type: 'POST', 
    url: myurl, 
    data: inputs, 
    cache: 'false', 
    success: function(data){ 
     console.log('success'); 
    }, 
    error: function(xhr, status, thrown){ 
     console.log("Error:"); 
     console.log(status); 
    } 
}); 

{"results":"success"} 

내 AJAX 코드입니다. 항상 오류 기능입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

UPDATE

나는 크롬에 그것을 밖으로 시도하고 XMLHttpRequest의 액세스 제어 - 허용 - 기원 오류 메시지를로드 할 수 있어요. 조사를 한 후 AJAX를 사용하여 다른 도메인의 URL에 액세스 할 수 없다는 것을 알았습니다. 컬을 통해 API를 호출하는 자바 스크립트와 동일한 도메인에 PHP 스크립트를 만들었습니다. 중간 스크립트를 사용하도록 아약스 스크립트를 설정 했으므로 잘 작동합니다.

나는 그냥 여기

url: 'localscript.php', 

작업 누군가가 유용 발견 한 경우 젠드 나머지 API를 호출하는 localscript.php 파일의 가져 아약스 기능의 URL 라인을 변경했습니다.

if ($_SERVER['REQUEST_METHOD'] === 'POST') { 

//add fields from POST 
foreach($_POST as $key => $value) { 
     $data[$key] = $value; 
} 

//url-ify the data for the POST 
$fields_string =''; 
foreach($data as $key=>$value) { 
    $fields_string .= $key.'='.urlencode($value).'&'; 
} 

rtrim($fields_string,'&'); 

//open connection 
$ch = curl_init(); 

//set the url, number of POST vars, POST data 
curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); 
curl_setopt($ch,CURLOPT_POST,true); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
curl_setopt($ch,CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)'); 

//execute post 
$result = curl_exec($ch); 
$info = curl_getinfo($ch); 

$start = stripos($result, "<body"); 
$end = stripos($result, "</body"); 

$body = substr($result,$start,$end); 
echo $body; 

//close connection 
curl_close($ch); 

}

+0

이 총 추측하지만 당신은 HttpResponseCode을 설정하지 않고 시도? –

+0

나는 그렇지 않았다. 그것을 시도했다. 기쁨은 없지만 감사합니다. – liz

답변

2

나는 당신이 $ 아약스 기능에 dataType:'jsonp' 매개 변수를 추가해야합니다 생각합니다. dataType

또한, Zend는 Zend_Controller_Action_Helper_Json을 사용하여 레이아웃을 제거하고 올바른 Content-Type을 보냅니다.

예 :

public function deleteAction() 
{ 
     $this->_helper->json(array(
      'msg'  => 'Lead has been deleted.', 
      'success' => true)); 
} 
+0

그것도 시도했다. 일하지 않았어. – liz

+0

@liz, 다른 도메인에 요청을하기 때문에 시도하십시오 : dataType : 'jsonp' –

+0

그게 효과가 있습니다! 감사. 나는 PHP 스크립트를 간간이로 유지할 것이지만 솔루션을 갖게되어 기쁘다. – liz