2011-11-01 169 views
3

我有以下的PHP代碼POST JSON使用PHP捲曲

 
curl_setopt($ch, CURLOPT_URL, $URL); 
curl_setopt($ch, CURLOPT_USERAGENT, $this->_agent); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->_headers); 
curl_setopt($ch, CURLOPT_ENCODING , "gzip"); 
curl_setopt($ch, CURLOPT_VERBOSE, false); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 120); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $this->_cookie_file_path); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $this->_cookie_file_path); 
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"folderId":"1","parameters":{"amount":3,"ascending":false,"offset":0,"sort":"date"}}'); 
curl_setopt($ch, CURLOPT_POST, 1); 

但我不明白爲什麼不工作。我發佈JSON的API說,沒有收到參數。我的代碼有什麼問題嗎?我認爲整個技巧在JSON參數上......我不確定如何發送它們,因爲我通常看不到任何「nave-> value」與http分析器,因爲它通常以簡單的形式出現...只是沒有任何「名稱」的JSON代碼。

+0

什麼是發送的內容類型?你爲什麼不使用'json_encode'? – mario

+0

@mario我試着用curl_setopt($ ch,CURLOPT_HTTPHEADER,array('Content-type:application/json'));並且不工作。默認情況下,我將標題設置爲$ headers = array( 「Expect:」, );我不明白它將如何與json_encode – Ameli

+0

一起工作您將不得不諮詢API維護者。我們只能猜測。 – mario

回答

1

您尚未設置內容類型,因此發佈的數據將作爲表單數據發送。嘗試將內容類型設置爲application/json。

如果這不起作用,請嘗試用數組包裝json字符串。

+0

我增加了curl_setopt ($ ch,CURLOPT_HTTPHEADER,array('Content-type:application/json')); 仍然不能正常工作 – Ameli

+0

嘗試使用array('jsoncode')作爲後置字段,如果不行的話,需要提供請求頭文件或遭受盲目猜測 – Anthony

+0

請調試信息(螢火蟲)http://pastebin.com/Ujdim8t8 我在此連結上加入調試資訊(螢火蟲)我無法在SO上發佈。它說它沒有格式化(儘管我嘗試了幾次來格式化它) – Ameli

1

如果:您使用POST方法,你應該知道:

CURLOPT_POST TRUE做一個普通的HTTP POST。此POST是普通的應用程序/ x-www-form-urlencoded類型,最常用的是HTML表單。

@see http://php.net/manual/en/function.curl-setopt.php

所以:你可以這樣做:

$ar_form = array('name'=>'PHPJungle','age'=>66,'gender'=>'male'); 
$poststr = http_build_query($ar_form); # important 

$options[CURLOPT_HTTPGET] = false; 
$options[CURLOPT_POST] = true; 
$options[CURLOPT_POSTFIELDS] = $poststr ; //default type:application/x-www-from-urlencoded 

curl_setopt_array ($ch, $options); 
# @todo your other codes 

這是我的課我已經使用了長時間及類是基於PHP捲曲。 它支持GET/POST,HTTP/HTTPS。

@see https://github.com/phpjungle/iHttp/

+0

我通常使用Fiddler捕獲http request.Download-url: http://www.telerik.com/fiddler這是一個很棒的工具支持代理等 – PHPJungle

1
$link = "http://test.domain/myquery"; 
    $json = '{"folderId":"1","parameters":{"amount":3,"ascending":false,"offset":0,"sort":"date"}}'; 
    $postdata = json_decode($json); 
echo openurl($link, $postdata); 

這個工作過程JSON解碼器將JSON字符串數組。

function openurl($url, $postvars = "") { 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_POST, 1); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_TIMEOUT, '3'); 
     $content = trim(curl_exec($ch)); 
     curl_close($ch); 
     return $content; 
    } 
1

我不知道,這是解決方案,但此發佈JSON時,從

'{"folderId":"1","parameters":{"amount":3,"ascending":false,"offset":0,"sort":"date"}}' 

"{'folderId':'1','parameters':{'amount':3,'ascending':false,'offset':0,'sort':'date'}}" 

唯一的變化而變化的JSON對我的作品我所做的是雙引號現在在外面,這對我很有用,但我顯然發佈到不同的服務器

只有其他幫助我可以提供的是下載網絡調試工具,如FiddlerCharles代理並監視發送/接收的請求,這可能是您的代碼中有其他錯誤的情況。

希望我幫助:)

3

您可以使用此與

curl_setopt($ch, CURLOPT_POSTFIELDS, '{"folderId":"1","parameters":{"amount":3,"ascending":false,"offset":0,"sort":"date"}}'); 

使用替換此

$Parameters = array(
    'MerchantCode'  => $MerchantCode, 
    'PriceValue'   => $amount, 
    'ReturnUrl'   => $callback, 
    'InvoiceNumber'  => $resnum, 
); 

    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($Parameters)); 
1

如果使用JSON數據使用機構發送請求您的API端點可能你可以使用Guzzle這裏的文檔是doc

use GuzzleHttp\Client; 
$client = new Client(); 
$request = $this->client->post($url,array(
      'content-type' => 'application/json' 
    ),array()); 
$request->setBody($json_data); 
$response = $request->send(); 
return $response; 

希望這項工作。

0

你可以做到這使由步驟:

$data = array(
    'folderId'=>"1","parameters"=>array(
     "amount"=>"3","ascending"=>false,"offset"=>0,"sort"=>"date" 
    ) 
); 

$data_string = http_build_query($data); 

$ch = curl_init(); 
curl_setopt($ch,CURLOPT_URL, $url); 
curl_setopt($ch,CURLOPT_POST, count($data)); 
curl_setopt($ch,CURLOPT_POSTFIELDS, $data_string); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$result = curl_exec($ch); 
curl_close($ch); 

$result = json_decode($result,true); 

不知道是否需要的頭,我認爲默認已經爲應用程序/ x-WWW的形式進行urlencode

ID它不起作用,請嘗試更改數組中的$ data值。認爲有幫助。 :)

0

您可以嘗試如下。 基本上,如果我們有一組數據,那麼它應該是json encoded使用php json_encode。而且你還應該添加content-typeheader可以在捲曲被定義爲curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

$data = array("country"=>"US","states"=>array("MHASASAS"=>"MH","XYZABABA"=>"XYZ")); 
$postdata = json_encode($data); 

$ch = curl_init($URL); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 
$result = curl_exec($ch); 
curl_close($ch); 
+0

這將不勝感激,如果你添加一些評論的代碼塊。 – mrun

+0

「基本上,如果我們有一個數據數組,那麼它應該使用php json_encode進行json編碼」 - 他們不這樣做。他們有一個包含有效JSON的字符串文字。 – Quentin

+0

「你還應該添加內容類型」 - 在2011年對此問題的評論中:他們表示他們這麼做了。 – Quentin

0

首先 的請捲曲HTTP狀態代碼

$http_code= curl_get_info($exec_res,CURL_HTTP_CODE); 

然後修改這個請求頭與後頭設置API服務器添加一個記錄器來記錄這些請求信息。