2013-08-11 1 views
0

저는 cURL을 사용하여 idibu (영국의 구직 게시판 회사)에 API 호출을 보내려고합니다. 필자가 제공 한 테스트 정보를 사용하여 성공적으로 전화를 걸었습니다. 당신은 (I 편집 및 해시 키를 제거했지만 실제 코드에가있다) 여기에 볼 수 있습니다 :XML이 작동하지 않는 PHP cURL

<?php 
/** 
* Define POST URL and also payload 
*/ 
define('XML_PAYLOAD', 'xml_text=%3C%3Fxml+version%3D%221.0%22+encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Cidibu%3E%0D%0A%3Cmethod%3Eadd%3C%2Fmethod%3E%0D%0A%3Cconfig%3E%0D%0A%3Cshow_durations%3Eno%3C%2Fshow_durations%3E%0D%0A%3Ccompletionurl%3Eemail%3C%2Fcompletionurl%3E%0D%0A%3Cadvertcompletionemail%3Ebob%40bob.com%3C%2Fadvertcompletionemail%3E%0D%0A%3Clockboards%3Eyes%3C%2Flockboards%3E%0D%0A%3Credirecturl%3Ehttp%3A%2F%2Fwww.google.com+%3C%2Fredirecturl%3E%0D%0A%3Cvalidate_level%3Ewarning%3C%2Fvalidate_level%3E%0D%0A%3C%2Fconfig%3E%0D%0A%3Cjob%3E%0D%0A%3Ctitle%3E%3C%21%5BCDATA%5BXML+v+3+test%2C+please+ignore+Special+%A3+%24+%26+%25+%40+%21+%3F+.+%2C+%3D+%29+%28+-+%3A+%3B+_+%2B+%27+%22+%80%5D%5D%3E%3C%2Ftitle%3E%0D%0A%3Creference%3EABC123456789%3C%2Freference%3E%0D%0A%3Cdescription%3E%3C%21%5BCDATA%5B%3Cb%3ESpecial+Te+%A3+%24+%26+%25+%40+%21+%3F+.+%2C+%3D+%29+%28+%2F+-+%3A+%3B+_+%2B+%27+%22+%27+here+euro+%80+%0D%0ABasic+Te+%A3+%24+%26+%25+%40+%21+%3F+.+%2C+%3D+%29+%28+%2F+-+%3A+%3B+_+%2B+%27+%22+%27+%80+%0D%0ASpecial+Te+%A3+%24+%26+%25+%40+%21+%3F+.+%2C+%3D+%29+%28+%2F+-+%3A+%3B+_+%2B+%27+%22+%27+%80+%0D%0A%0D%0A+%0D%0A+Special+Te+%A3+%24+%26+%25+%40+%21+%3F+.+%2C+%3D+%29+%28+%2F+-+%3A+%3B+_+%2B+%27+%22+%27+%80+%0D%0ABasic+Te+%A3+%24+%26+%25+%40+%21+%3F+.+%2C+%3D+%29+%28+%2F+-+%3A+%3B+_+%2B+%27+%22+%27+%80+%0D%0A%0D%0A+%96+%96+%92+%27+%95+++++++%2C+%09%2C+%95+%B7+%93+%94+%D8+%85+%A8+%A6+%27+%3A+%27+%83+%E1+%91+%BA+%A1+%A7+%E9+%D7+%87+%27+%3A+%27+%27+%C7+%BD+%84+h+%AE+%97+%AC+%83+%E1+%99%3C%2Fb%3E%5D%5D%3E%3C%2Fdescription%3E%0D%0A%3Csender%3E%0D%0A%3Cname%3ESteve%3C%2Fname%3E%0D%0A%3Clastname%3ERogers%3C%2Flastname%3E%0D%0A%3Cemail%3Etest%40mail.net%3C%2Femail%3E%0D%0A%3Ccompany%3EOne+World+Market%3C%2Fcompany%3E%0D%0A%3Cphone%3E44+%280%29+111-1111111%3C%2Fphone%3E%0D%0A%3Cwww%3Ehttp%3A%2F%2Fuk.idibu.com+%3C%2Fwww%3E%0D%0A%3Ccountry%3EUK%3C%2Fcountry%3E%0D%0A%3Cpostcode%3E020+1111+1111%3C%2Fpostcode%3E%0D%0A%3C%2Fsender%3E%0D%0A%3Ccategory+id%3D%2221%22+%2F%3E%0D%0A%3Clocation+id%3D%228%22+%2F%3E%0D%0A%3Csublocation+id%3D%22668%22+%2F%3E%0D%0A%3Cjobtype+id%3D%222%22+%2F%3E%0D%0A%3Cjob_time%3E2%3C%2Fjob_time%3E%0D%0A%3Cstartdate%3E2011-11-26%3C%2Fstartdate%3E%0D%0A%3Cduration%3EFull+time%3C%2Fduration%3E%0D%0A%3Csalarymin%3E20000%3C%2Fsalarymin%3E%0D%0A%3Csalarymax%3E25000%3C%2Fsalarymax%3E%0D%0A%3Csalaryper+value%3D%22annum%22+%2F%3E%0D%0A%3CsalaryOverride%3ESalary+override+test+test%3C%2FsalaryOverride%3E%0D%0A%3Ccurrency%3EGBP%3C%2Fcurrency%3E%0D%0A%3Cpublish%3E2011-11-26%3C%2Fpublish%3E%0D%0A%3Cposts%3E%0D%0A%3Cboard+id%3D%22517%22%3E%0D%0A%3Cextrafield+name%3D%22idibudts_cat%22%3E3%3C%2Fextrafield%3E%0D%0A%3Cduration+days%3D%227%22+%2F%3E%0D%0A%3C%2Fboard%3E%0D%0A%3C%2Fposts%3E%0D%0A%3C%2Fjob%3E%0D%0A%3C%2Fidibu%3E'); 
define('XML_POST_URL', 'http://ws.idibu.com/clients/api/REMOTE/V3/[INSERT HASH KEY]'); 

/** 
* Initialize handle and set options 
*/ 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, XML_POST_URL); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 4); 
curl_setopt($ch, CURLOPT_POSTFIELDS, XML_PAYLOAD); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: close')); 

/** 
* Execute the request and also time the transaction 
*/ 
$start = array_sum(explode(' ', microtime())); 
$result = curl_exec($ch); 

$xml = simplexml_load_string($result); 
$json = json_encode($xml); 
$arr = json_decode($json,true); 

$temp = array(); 
foreach($arr as $k=>$v) { 
     foreach($v as $k1=>$v1) { 
     $temp[$k][$k1] = $v1; 
     } 
} 


$stop = array_sum(explode(' ', microtime())); 
$totalTime = $stop - $start; 

/** 
* Check for errors 
*/ 
if (curl_errno($ch)) { 
    $result = 'ERROR -> ' . curl_errno($ch) . ': ' . curl_error($ch); 
} else { 
    $returnCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    switch($returnCode){ 
     case 404: 
      $result = 'ERROR -> 404 Not Found'; 
      break; 
     default: 
      break; 
    } 
} 

/** 
* Close the handle 
*/ 
curl_close($ch); 

/** 
* Output the results and time 
*/ 
echo 'Total time for request: ' . $totalTime . "\n"; 
echo $json; 

/** 
* Exit the script 
*/ 
    exit(0); 
?> 

나는 여기에 데이터를 디코딩 : http://coderstoolbox.net/string/#!encoding=xml&action=encode&charset=us_ascii합니다. 그리고 전체 XML을 더 쉽게 이해할 수 있도록 작성했습니다. 따라서 처리 할 자체 변수를 입력 할 수 있습니다. XML을 (디코드 된 형식으로) POST하고 싶지만 얻을 수없는 것 같습니다. 그것은 작동하기 위해 여기에 내가 시도한 작업은 다음과 같습니다.

나는 또한 XML_PAYLOAD로 정의 할 때 두 번 내가 할 '$ XML'주위에 따옴표없이 그것을 시도했습니다
<?php 
/** 
* Define POST URL and also payload 
*/ 
$xml = htmlentities('xml_text=<?xml version="1.0" encoding="UTF-8"?> 
<idibu> 
<method>add</method> 
<config> 
<show_durations>no</show_durations> 
<completionurl>email</completionurl> 
<advertcompletionemail>[email protected]</advertcompletionemail> 
<lockboards>yes</lockboards> 
<redirecturl>http://www.google.com </redirecturl> 
<validate_level>warning</validate_level> 
</config> 
<job> 
<title><![CDATA[XML v 3 test, please ignore Special £ $ & % @ ! ? . , =) (- : ; _ + ]]></title> 
<reference>ABC123456789</reference> 
<description><![CDATA[<b>Special Te £ $ & % @ ! ? . , =) (/ - : ; _ + " here euro 
Basic Te £ $ & % @ ! ? . , =) (/ - : ; _ + " 
Special Te £ $ & % @ ! ? . , =) (/ - : ; _ + " 


Special Te £ $ & % @ ! ? . , =) (/ - : ; _ + " 
Basic Te £ $ & % @ ! ? . , =) (/ - : ; _ + " 

      , , · Ø ¨ ¦ : á º ¡ § é × : Ç ½ h ® ¬ á </b>]]></description> 
<sender> 
<name>Steve</name> 
<lastname>Rogers</lastname> 
<email>[email protected]</email> 
<company>One World Market</company> 
<phone>44 (0) 111-1111111</phone> 
<www>http://uk.idibu.com </www> 
<country>UK</country> 
<postcode>020 1111 1111</postcode> 
</sender> 
<category id="21" /> 
<location id="8" /> 
<sublocation id="668" /> 
<jobtype id="2" /> 
<job_time>2</job_time> 
<startdate>2011-11-26</startdate> 
<duration>Full time</duration> 
<salarymin>20000</salarymin> 
<salarymax>25000</salarymax> 
<salaryper value="annum" /> 
<salaryOverride>Salary override test test</salaryOverride> 
<currency>GBP</currency> 
<publish>2011-11-26</publish> 
<posts> 
<board id="517"> 
<extrafield name="idibudts_cat">3</extrafield> 
<duration days="7" /> 
</board> 
</posts> 
</job> 
</idibu>'); 

define('XML_PAYLOAD', '$xml'); 
define('XML_POST_URL', 'http://ws.idibu.com/clients/api/REMOTE/V3/[INSERT HASH KEY]'); 

/** 
* Initialize handle and set options 
*/ 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, XML_POST_URL); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 4); 
curl_setopt($ch, CURLOPT_POSTFIELDS, XML_PAYLOAD); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: close')); 

/** 
* Execute the request and also time the transaction 
*/ 
$start = array_sum(explode(' ', microtime())); 
$result = curl_exec($ch); 

$xml = simplexml_load_string($result); 
$json = json_encode($xml); 
$arr = json_decode($json,true); 

$temp = array(); 
foreach($arr as $k=>$v) { 
    foreach($v as $k1=>$v1) { 
    $temp[$k][$k1] = $v1; 
    } 
} 

$stop = array_sum(explode(' ', microtime())); 
$totalTime = $stop - $start; 

/** 
* Check for errors 
*/ 
if (curl_errno($ch)) { 
    $result = 'ERROR -> ' . curl_errno($ch) . ': ' . curl_error($ch); 
} else { 
    $returnCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    switch($returnCode){ 
     case 404: 
      $result = 'ERROR -> 404 Not Found'; 
      break; 
     default: 
      break; 
    } 
} 

/** 
* Close the handle 
*/ 
curl_close($ch); 

/** 
* Output the results and time 
*/ 
echo 'Total time for request: ' . $totalTime . "\n"; 
echo $json; 

/** 
* Exit the script 
*/ 
exit(0); 
?> 

:.

"error":"The xml payload is missing" 

htmlentities 기능을 사용하지 않으면 페이로드가 읽히지 만 'TITLE 태그가 없습니다'등과 같이 오류가 있습니다. 명확하게 거기에 있습니다.이 때문에 일부 인코딩을해야 할 필요가 있습니다. 그 정보를 입력하기 전에

올바른 방향으로 지적하면 도움을 주실 수 있습니다. 감사!

+0

게시물 본문을 인코딩하지 않습니다. 또한 Content-type 헤더를 설정하십시오. 그것은 텍스트/xml이어야합니다 – pguardiario

답변

2

htmlentities 대신 rawurlencode를 사용해야하며 'payload'의 XML 부분에서만 사용해야합니다. 또한 변수 주위에 작은 따옴표를 사용하여 상수를 "$ xml"이라는 리터럴 텍스트로 정의하고 있습니다. 따라서이 두 행을 다음으로 대체해야합니다.

$xml = 'xml_text='.rawurlencode('<?xml … </idibu>'); # <-- insert entire XML there 

define('XML_PAYLOAD', $xml); 
+0

그랬어. 놀랄 만한. 고마워요, 저는이 퍼즐의 마지막 부분과 지금 꽤 오랫동안 씨름하고 있습니다. 감사! – MillerMedia