2010-09-27 115 views
0

我想使用PHP cURL發佈到REST服務,但我遇到了一些困難(這是我從來沒有使用cURL之前!!)。cURL POST到REST服務

我已經把這段代碼:

<?php 
error_reporting(E_ALL); 
if ($result == "00") 
{ 

$url = 'http://127.0.0.1/xxxxxx/AccountCreator.ashx'; /*I've tried it a combination of ways just to see which might work */ 

$curl_post_data = array(
    'companyName' =>urlencode($companyName), 
    'mainContact' =>urlencode($mainContact), 
    'telephone1' =>urlencode($telephone1), 
    'email' => urlencode($email), 
    'contact2' => urlencode($contact2), 
    'telephone2' => urlencode($telephone2) 
    'email2' => urlencode($email2); 
    'package' => urlencode($package) 
    ); 

foreach($curl_post_data as $key=>$value) {$fields_string .=$key. '=' .$value.'&'; 
} 
rtrim($fields_string, '&'); 
die("Test: ".$fields_string); 

$ch = curl_init(); 

curl_setopt ($ch, CURLOPT, $url); 
curl_setopt ($ch, CURLOPT_POST, count($curl_post_data)); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, $fields_string); 

$result = curl_exec($ch); 

curl_close($ch); 

在此之後,我的代碼發送電子郵件,並執行IF語句。我知道這工作正常,當我嘗試插入此cURL請求時,我纔開始遇到麻煩。

我試過這個,但它不運行。就像我跟支付合作夥伴整合,它只是說:

Your transaction has been successful but there was a problem connecting back to the merchant's web site. Please contact the merchant and advise them that you received this error message. Thank you. 

時收到的確切的錯誤是HTTP 500錯誤。

謝謝。這裏

+2

'電子郵件'=>進行urlencode($電子郵件), 'contact2'=>進行urlencode($ contact2) 'telephone2'=>進行urlencode($ telephone2) 'EMAIL2'=>進行urlencode($ EMAIL2); 'package'=> urlencode($ package)你應該真的修復這個數組!它丟失了逗號,還有一個分號..這一切都搞砸了 – sathia 2010-09-27 10:07:39

+0

@sathia,謝謝,我修正了這個問題。尷尬我錯過了!模具(「Test:」。$ fields_string);正在輸出:: Test:companyName = xxx&mainContact = xxx + xxx&telephone1 = xxxx,其中包含所有正確的值。然而,這是所有輸出 - 它不會更新我的數據庫,它不會繼續處理以下mail()函數或IF語句。 – 109221793 2010-09-27 10:28:56

+0

當然,現在你需要評論一下die(),因爲die不知道死的是什麼:殺死程序的執行。只是評論它/ /死(「測試..它會繼續 – sathia 2010-09-27 10:36:44

回答

3
foreach($curl_post_data as $key=>value) {$fields_string .=$key. '=' .value.'&'; 

值丟失一美元我想

foreach($curl_post_data as $key => $value) {$fields_string .=$key. '=' .$value.'&'; 

你試過die($fields_string);,看看你有什麼實際發送給商家?

+0

我嘗試在缺失的地方插入美元符號,但仍然沒有喜悅。無論如何, – 109221793 2010-09-27 09:00:48

+0

是否已經添加了美元符號?what die($ fields_string);打印? – sathia 2010-09-27 09:07:02

+0

@sathia,yup,兩個美元符號我沒有嘗試死亡($ fields_string);打印,我應該在哪裏插入這個? – 109221793 2010-09-27 09:11:17

1

首先:你在本地測試嗎?因爲您使用的IP不是有效的服務器地址。

設置URL的常數稱爲CURLOPT_URL:

curl_setopt ($ch, CURLOPT_URL, $url); 

而且CURLOPT_POST必須是真或假(http://php.net/curl_setopt),而不是一個數(除1人可能):

curl_setopt ($ch, CURLOPT_POST, true); 

這裏的一些POST示例代碼:PHP + curl, HTTP POST sample code?

+0

@DanMan,謝謝你的回覆。不,我正在服務器上測試。目前我正在連接的Web服務位於不同的端口上,它表示IP地址末尾的00 :.這是我不確定的事情之一 - 如果我可以使用端口號? – 109221793 2010-09-27 09:06:04

+0

我認爲它可以工作,但是您也可以嘗試設置CURLOPT_PORT。 – DanMan 2010-09-27 09:11:30

+0

如果你直接在服務器上測試,那麼IP應該是127.0.0.1 – DanMan 2010-09-27 09:18:17

1

這將是最好的,如果你可以提供你的PHP版本。

從PHP 5開始,一些便利的函數被捆綁在覈心而不是單獨的PECL庫中。

// If you are working with normal HTTP requests, simply do this. 
$curl_post_data = http_build_query($curl_post_data); 

curl_setopt($ch, CURLOPT, $url); 

// This is a boolean option, although passing non-zero integer 
// will be type-casted to TRUE, count() is not the proper way. 
curl_setopt($ch, CURLOPT_POST, TRUE); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $curl_post_data); 

// If you really want the next statement be meaningful, do this. 
// Otherwise your HTTP response will be passed directly into 
// the output buffer. 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 

$result = curl_exec($ch); 

請記住,在PHP CURLOPT_POSTFIELDS支持文件上傳,通過添加「@」字符後面的值完整的文件路徑。

你不想在這種情況下調用http_build_query()。

文件示例代碼上傳

$curl_post_data = array('file1' => '@/home/user/files_to_be_uploaded'); 

雖然你可以選擇指定的MIME類型,請參閱documentation以獲取更多信息。

如上所述,請先檢查您的PHP版本。此功能僅適用於PHP 5,AFAIK還有一些公司仍然在其服務器中託管PHP 4.x。