2012-03-14 37 views
15

Tôi đang cố gắng gỡ lỗi bài đăng http mà tôi đang cố gắng gửi từ ứng dụng danh sách. Tôi đã có thể gửi bài đăng chính xác từ CURL php mà corectly giao diện với trang web drupal 7 của tôi và tải lên một hình ảnh.Lấy nội dung từ bài đăng http bằng cách sử dụng php CURL

Để có được điều này để làm việc trong ứng dụng lisp của tôi, tôi thực sự cần phải nhìn thấy cơ thể nội dung của bài http tôi đã có thể nhìn thấy các tiêu đề bằng một cuộc gọi như thế này:

curl_setopt($curl, CURLOPT_STDERR, $fp); 
curl_setopt($curl, CURLOPT_VERBOSE, 1); 

và các tiêu đề trông giống nhau trong ứng dụng lisp của tôi nhưng tôi không thể kiểm tra phần thân của bài đăng. Tôi đã tìm kiếm trực tuyến và những người khác đã đặt câu hỏi này nhưng không ai đăng câu trả lời.

Kiểu nội dung của bài http tôi là:

application/x-www-form-urlencoded 

Tôi cũng đã thử nhiều proxy http cụ debuging nhưng họ chỉ từng http GET để có được trang php của tôi, nhưng không bao giờ nắm bắt được gửi từ máy chủ một lần mã php được thực thi.

EDIT: Tôi đã thêm một mã snipet hiển thị nơi tôi thực sự tải lên tệp hình ảnh.

// file 
$file = array(
    'filesize' => filesize($filename), 
    'filename' => basename($filename), 
    'file' => base64_encode(file_get_contents($filename)), 
    'uid' => $logged_user->user->uid, 
); 

$file = http_build_query($file); 

// REST Server URL for file upload 
$request_url = $services_url . '/file'; 

// cURL 
$curl = curl_init($request_url); 
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded')); 
curl_setopt($curl, CURLOPT_STDERR, $fp); 
curl_setopt($curl, CURLOPT_VERBOSE, 1); 
curl_setopt($curl, CURLOPT_POST, 1); // Do a regular HTTP POST 
curl_setopt($curl, CURLOPT_POSTFIELDS, $file); // Set POST data 
curl_setopt($curl, CURLOPT_HEADER, FALSE); // Ask to not return Header 
curl_setopt($curl, CURLOPT_COOKIE, "$cookie_session"); // use the previously saved session 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($curl, CURLOPT_FAILONERROR, TRUE); 
curl_setopt_array($curl, array(CURLINFO_HEADER_OUT => true)); 
$response = curl_exec($curl); 
+0

Tôi không cho rằng bạn tìm thấy câu trả lời cho điều này? – user1854496

+0

'curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true);' – Bobot

Trả lời

18

CURLOPT_VERBOSE thực sự sẽ hiển thị chi tiết. Nếu bạn đang tìm kiếm nội dung của nội dung phản hồi, bạn cũng có thể sử dụng CURLOPT_RETURNTRANSFER, curl_exec() sau đó sẽ trả về nội dung phản hồi.

Nếu bạn cần kiểm tra nội dung yêu cầu, CURLOPT_VERBOSE nên cung cấp cho bạn nhưng tôi không hoàn toàn chắc chắn.

Trong mọi trường hợp, good network sniffer sẽ cung cấp cho bạn tất cả chi tiết một cách minh bạch.

Ví dụ:

$curlOptions = array(
    CURLOPT_RETURNTRANSFER => TRUE, 
    CURLOPT_FOLLOWLOCATION => TRUE, 
    CURLOPT_VERBOSE => TRUE, 
    CURLOPT_STDERR => $verbose = fopen('php://temp', 'rw+'), 
    CURLOPT_FILETIME => TRUE, 
); 

$url = "http://stackoverflow.com/questions/tagged/java"; 
$handle = curl_init($url); 
curl_setopt_array($handle, $curlOptions); 
$content = curl_exec($handle); 
echo "Verbose information:\n", !rewind($verbose), stream_get_contents($verbose), "\n"; 
curl_close($handle); 
echo $content; 

Output:

Verbose information: 
* About to connect() to stackoverflow.com port 80 (#0) 
* Trying 64.34.119.12... 
* connected 
* Connected to stackoverflow.com (64.34.119.12) port 80 (#0) 
> GET /questions/tagged/java HTTP/1.1 
Host: stackoverflow.com 
Accept: */* 

< HTTP/1.1 200 OK 
< Cache-Control: private 
< Content-Type: text/html; charset=utf-8 
< Date: Wed, 14 Mar 2012 19:27:53 GMT 
< Content-Length: 59110 
< 
* Connection #0 to host stackoverflow.com left intact 

<!DOCTYPE html> 
<html> 



<head> 



    <title>Newest &#39;java&#39; Questions - Stack Overflow</title> 
    <link rel="shortcut icon" href="http://cdn.sstatic.net/stackoverflow/img/favicon.ico"> 
    <link rel="apple-touch-icon" href="http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png"> 
    <link rel="search" type="application/opensearchdescription+xml" title="Stack Overflow" href="/opensearch.xml"> 
... 
+0

CURLOPT_VERBOSE chỉ có vẻ hiển thị cho tôi tiêu đề là có một số cờ khác mà tôi cần phải đặt? – Mike2012

+0

Wireshark chỉ dường như chỉ cho tôi GET được gửi để tải trang php của tôi nhưng không POST được gửi từ mã PHP. – Mike2012

+0

@ Mike2012: Có, CURLOPT_VERBOSE không trả về nội dung phản hồi. Tôi đã thêm một ví dụ cho bạn thấy cách truy xuất nội dung phản hồi, đó là 'CURLOPT_RETURNTRANSFER'. Nếu đó không phải là những gì bạn cần, sau đó vui lòng chỉ định những gì bạn cần. Và wireshark cho bạn thấy mọi thứ * đi qua dây. – hakre

2

Tôi nghĩ rằng bạn nên làm điều này với một proxy hơn trong PHP. Tôi không nghĩ rằng nó có thể kéo dữ liệu POST thô từ thư viện CURL PHP.

Một proxy sẽ hiển thị cho bạn những yêu cầu và đáp ứng nội dung

+0

Cảm ơn bạn đã trả lời James. Tôi đã thử khá một vài proxy nhưng họ chỉ dường như bắt GET để tải trang php của tôi, không bao giờ POST từ mã php đang được thực thi. – Mike2012

4

Nếu bạn đang nói về xem phản ứng, nếu bạn thêm curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);, sau đó các tài liệu được trả về bởi các yêu cầu cần được trở về từ cuộc gọi của bạn để curl_exec.

Nếu bạn đang nói về việc xem bài đăng bạn đang gửi, tốt, bạn sẽ có thể xem nó ngay từ khi bạn đang thiết lập điều đó trong PHP của bạn.

CHỈNH SỬA: Đăng tệp, eh? Nội dung của $file là gì? Tôi đoán có thể là một cuộc gọi đến file_get_contents()?

Hãy thử một cái gì đó như thế này:

$postdata = array('upload' => '@/path/to/upload/file.ext'); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata); 

Bạn có thể không chỉ cần gửi các tập tin, bạn vẫn cần một mảng POSTDATA mà gán một chìa khóa để tập tin đó (do đó bạn có thể truy cập bằng PHP như $_FILES['upload']).Ngoài ra, @ yêu cầu cURL tải nội dung của tệp được chỉ định và gửi nội dung đó thay vì chuỗi.

+0

Hey Ryan cảm ơn phản hồi của bạn. Tôi đang cố gắng để xem các postdata nhưng tôi không trực tiếp thiết lập nó. Tôi đang cố gắng để tải lên một tập tin với bài đăng này và tôi thiết lập rằng với một cuộc gọi như thế này: curl_setopt ($ curl, CURLOPT_POSTFIELDS, $ file); có cách nào đó tôi vẫn có thể in cái này không? – Mike2012

+0

@ Mike2012 Ok, tôi đã cập nhật câu trả lời của mình. Hãy cho tôi biết nếu giả định của tôi không chính xác và đăng mã nếu cần. –

+0

cảm ơn một lần nữa. Tôi đang tải lên một tệp hình ảnh và tôi đã cập nhật ví dụ của mình để bao gồm một đoạn mã hiển thị cách tôi đang thực hiện điều đó. Trong ví dụ của bạn có vẻ như việc tải lên thẻ được liên kết với tệp và sau đó được sử dụng làm người truy cập vào $ _FILES, nhưng trong trường hợp của tôi, tôi không hoàn toàn thiết lập theo cách đó. Tôi vẫn có thể làm một cái gì đó tương tự với mã của tôi? Ngoài ra, trong ví dụ của tôi sẽ dữ liệu tập tin này là toàn bộ nội dung của bài đăng hoặc sẽ có một số loại tiêu đề xác định tên tập tin và như vậy? – Mike2012

6

Bạn đang ở rất gần:

Các PHP manual chỉ thị mà bạn phải gọi CURLINFO_HEADER_OUT liên tục trong cả curl_setopt và curl_getinfo.

$ch = curl_init($url); 
... other curl options ... 
curl_setopt($ch,CURLINFO_HEADER_OUT,true); 

curl_exec(ch); 
//Call curl_getinfo(*args) after curl_exec(*args) otherwise the output will be NULL. 
$header_info = curl_getinfo($ch,CURLINFO_HEADER_OUT); //Where $header_info contains the HTTP Request information 

Tóm tắt

  • Set curl_setopt
  • Set curl_getinfo
  • Gọi curl_getinfo sau curl_exec
+3

Điều đó dường như chỉ hiển thị tiêu đề, câu hỏi liên quan đến nội dung của yêu cầu – ChristoKiwi

8

Chỉ cần gửi nó vào một cổng địa phương ngẫu nhiên và lắng nghe trên đó.

# terminal 1 
nc -l localhost 12345 

# terminal 2 
php -e 
<?php 
$curl = curl_init('http://localhost:12345'); 
// etc 
+0

Tôi phải làm 'nc -l localhost -p 12345' – par

0

Để có được tiêu đề CURLINFO_HEADER_OUT cờ cần phải được thiết lập trước khi curl_exec được gọi. Sau đó sử dụng curl_getinfo với cùng một cờ để lấy tiêu đề sau curl_exec.

Nếu bạn muốn xem các dữ liệu bưu điện, lấy các giá trị mà bạn đặt ở CURLOPT_POSTFIELDS

Ví dụ:

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, "http://example.com/webservice"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payload)); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 

curl_exec($ch); 

$header = curl_getinfo($ch, CURLINFO_HEADER_OUT); 

curl_close($ch); 

echo "Request-Header:\r\n" . $header . "\r\n"; 
echo "Request-Body(URL Encoded):\r\n" . http_build_query($payload) . "\r\n"; 
echo "Request-Body(Json Encoded):\r\n" . json_encode($payload) . "\r\n"; 
Các vấn đề liên quan