2011-07-24 27 views
13

- Câu hỏi -Làm cách nào để truy cập vào dữ liệu PUT của PHP REST API ở phía máy chủ?

Tôi chỉ mới bắt đầu với API REST và đang trở nên khá bối rối.

Đây là những gì mà phía máy khách PHP cRUL của tôi trông giống như một PUT.

case 'PUT': 
    curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT'); 
    curl_setopt($handle, CURLOPT_POSTFIELDS, $data); 
    break; 

Bây giờ khi tôi nhìn vào máy chủ của tôi $ _SERVER [ 'REQUEST_METHOD'] cho thấy PUT, nhưng câu hỏi của tôi là làm thế nào để lấy dữ liệu $ Tôi gửi với CURLOPT_POSTFIELDS.

Tất cả những gì tôi cần làm là lấy $ data được gửi cùng với yêu cầu PUT vào dòng tiếp theo. Giống như

$value = $data['curl_data']; 

Tôi đã thấy rất nhiều lộn xộn về chủ đề này khiến tôi đau đầu. Nó có vẻ rất dễ dàng trên phía máy khách php, nhưng không ai có câu trả lời đang làm việc cho phía máy chủ php.

Cảm ơn bạn đã trợ giúp!

- trả lời (sau khi giúp đỡ và bài tập về nhà) -

Tôi mới vì vậy tôi không thể trả lời câu hỏi của riêng tôi cho đến khi sau 8 giờ ... lẻ :)

Okay , sau khi làm việc với những người tuyệt vời ở đây tôi phải nói rằng chúng tôi đã chạy vào câu trả lời. Tôi đá bản thân mình vì nó thật dễ dàng, đồng thời nó cũng khó hiểu.

curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT'); 
curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($data)); 

Thay đổi đầu tiên (ở trên) Tôi phải thêm http_build_query() quanh $ data. Điều này lấy dữ liệu của tôi từ một mảng đến một chuỗi thân thiện với url.

Tiếp theo tôi phải thêm.

parse_str(file_get_contents('php://input'), $put); 

Bây giờ tôi có thể làm những việc như $ đặt ['dữ liệu'].

Câu trả lời mà PaulPRO đưa ra ở trên không hoạt động để lấy dữ liệu giống như cách file_get_contents() đã làm với ít dòng hơn. Chúng tôi đã gặp khó khăn cố gắng tìm ra cách phân tích cú pháp dữ liệu mà tôi thiếu http_build_query() mà tôi đã thấy trên một trang web khác được phát huy.

Vì vậy, đây là cách tất cả hoạt động.

  1. Dữ liệu được đưa vào một mảng bình thường.
  2. http_build_query() chuyển đổi nó thành một chuỗi gần giống như GET.
  3. file_get_contents() chuyển nó từ máy khách đến máy chủ.
  4. parse_str() sau đó biến nó trở lại thành một mảng.

Tôi thấy rất nhiều thông báo về việc sử dụng PUT để gửi tệp. Tôi có thể thấy cách làm việc này, nhưng từ những gì tôi đọc trong toàn bộ quá trình REST này là PUT là để cập nhật dữ liệu như bài viết là tạo dữ liệu. Có lẽ tôi đã nhầm. Tui bỏ lỡ điều gì vậy?

+1

Có thể [những] [http://blog.steveklabnik.com/2011/07/03/nobody-understands-rest-or-http.html) [liên kết] (http://quandyfactory.com/blog/65 /designing_a_restful_web_application#toc_5.3) sẽ giúp bạn hiểu rõ hơn về một số điều kỳ quặc của REST. – nevvermind

Trả lời

7

Từ PHP Manual: Dữ liệu

PUT đến từ stdin:

$putdatafp = fopen("php://input", "r");

Ví dụ sử dụng:

$putfp = fopen('php://input', 'r'); 
$putdata = ''; 
while($data = fread($putfp, 1024)) 
    $putdata .= $data; 
fclose($putfp); 
+0

Được rồi dẫn đầu với cả hai. Phần trên trả về tài nguyên # 11. Làm cách nào để truy cập tài nguyên đó. Và phía dưới trả về dữ liệu trong một chuỗi lộn xộn, nhưng tôi thấy nó ở đó. – Shylor

+0

@sylor Tôi đã chỉnh sửa bài đăng của mình. Dữ liệu có chính xác trong '$ putdata' sau mã đó không? – Paulpro

+0

Tôi đang gặp phải một vài lỗi khi kích hoạt. Cảnh báo: filesize() [function.filesize]: stat không thành công cho Resource id # 11. Nó cũng cho tôi biết rằng kích thước tập tin không thể là 0 trên fread. – Shylor

4

Tôi đã cùng một kịch bản mà ở, phải gửi dữ liệu tới Máy chủ PHP thông qua API ReST bằng phương pháp PUT. Tôi đấu tranh gần như vài giờ để tìm ra giải pháp, nhưng cuối cùng tìm thấy đường đi:

Trong curl:

$postData = http_build_query($data); 
curl_setopt($ch, CURLOPT_POSTFIELDS,$postData); 

Chúng tôi đã phân tích các dữ liệu vào một let biến nói: $ putData, Dưới đây, là thủ tục Parse string:

parse_str(file_get_contents("php://input"),$putData); 

Sau đó in $putData, sẽ nhận được cùng một mảng mà bạn đang đăng trong curl ..

+0

Câu trả lời này là cách tốt nhất tôi thích. 'parse_str (file_get_contents (" php: // input "), $ putData); ' –

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