2010-12-31 33 views
7

Luôn nhận được một trạng thái 0 mặc dù nếu tôi sao chép và dán url gửi vào trình duyệt của mình, tôi nhận được một đối tượng json quay lại ngayBất kỳ điều gì sai với mã cURL của tôi (trạng thái http là 0)?

<?php 


$mainUrl = "https://api.xxxx.com/?"; 
$co = "xxxxx"; 
$pa = "xxxx"; 
$par = "xxxx"; 
$part= "xxxx"; 
$partn = "xxxx"; 
$us= "xxx"; 
$fields_string; 
$fields = array(
      'co'=>urlencode($co), 
      'pa'=>urlencode($pa), 
      'par'=>urlencode($par), 
      'part'=>urlencode($part), 
      'partn'=>urlencode($partn), 
      'us'=>urlencode($us) 
      ); 

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

$fields_string = rtrim($fields_string, "&"); 
$fields_string = "?" . $fields_string; 

$url = "https://api.xxxxx.com/" . $fields_string; 

$request = $url; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_TIMEOUT,'3'); 
$content = trim(curl_exec($ch)); 
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

curl_close($ch); 
print $url; 
print $http_status; 
print $content; 



?> 
+0

chỉ là một mặt lưu ý không liên quan: PHP có rất tiện dụng 'http_build_query' chức năng. http://php.net/manual/en/function.http-build-query.php – nico

+0

là 'https', có lỗi nào được trả lại không? – ajreal

+0

Yup, chỉ nhận ra rằng việc kiểm tra lỗi sẽ hữu ích. – Ilya

Trả lời

21

nhận ra rằng tôi đã có vấn đề SSL. Chỉ cần đặt CURLOPT_SSL_VERIFYPEER và CURLOPT_SSL_VERIFYHOST thành sai. Công trinh.

+7

Nếu bạn muốn sử dụng SSL, bạn có thể thêm cờ CURLOPT_CAINFO và trỏ tới chứng chỉ. Giống như 'curl_setopt ($ curl, CURLOPT_CAINFO, BASE_DIR.' /certs/cacert.pem ');' – joelcox

+1

@Xoc: +1 từ tôi để chỉ ra rằng kết nối an toàn là tùy chọn ở đây. –

3

Bạn nên luôn đặt tùy chọn CURLOPT_VERBOSE khi bạn đang gỡ lỗi để cuộn tròn. Giá trị thời gian chờ của bạn trông rất thấp.

17

FYI, bạn cũng có thể nhận mã trạng thái là 0 nếu kết nối curl hết thời gian trước khi máy chủ từ xa trả về dữ liệu. Trong trường hợp đó, bạn cần phải đặt thời gian curl ra các tùy chọn để tránh tình huống đó. Chỉ cần đăng bài này cho bất cứ ai khác có vấn đề về trạng thái 0.

+3

Chi tiết về cách đặt thời gian curl ở đây http://stackoverflow.com/a/11066378/243233 – Jus12

7

tôi đã cùng một vấn đề, bạn phải chạy curl_exec ($ ch) lệnh trước khi bạn chạy các curl_getinfo ($ ch) lệnh.

+1

Hoàn hảo! Đây là vấn đề đối với tôi! – Magnus

4

vì vậy hãy thử này, bạn sẽ nhận được kết quả dương tính tôi đã thêm CURLOPT_SSL_VERIFYPEER và CURLOPT_SSL_VERIFYHOST false

<?php 


$mainUrl = "https://api.xxxx.com/?"; 
$co = "xxxxx"; 
$pa = "xxxx"; 
$par = "xxxx"; 
$part= "xxxx"; 
$partn = "xxxx"; 
$us= "xxx"; 
$fields_string; 
$fields = array(
      'co'=>urlencode($co), 
      'pa'=>urlencode($pa), 
      'par'=>urlencode($par), 
      'part'=>urlencode($part), 
      'partn'=>urlencode($partn), 
      'us'=>urlencode($us) 
      ); 

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

$fields_string = rtrim($fields_string, "&"); 
$fields_string = "?" . $fields_string; 

$url = "https://api.xxxxx.com/" . $fields_string; 

$request = $url; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_TIMEOUT,'3'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false); 
$content = trim(curl_exec($ch)); 
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

curl_close($ch); 
print $url; 
print $http_status; 
print $content; 



?> 
+0

hoàn hảo. làm việc tốt :) –

Các vấn đề liên quan