2011-07-13 9 views
6

RESTful bir APi oluşturmaya çalışıyorum.PHP ile PUT istekleri gönderme/alma, istek gövdesini ayrıştırmakta sorun mu yaşıyorsunuz?

Ben böylece bir PUT isteği yolluyorum:/API/müşteri/1

$data['name'] = 'test'; 

$ch = curl_init('myurl/api/'.$name); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
$results = json_decode(curl_exec($ch)); 

ben isteği gövdesine olacak varsayalım postFields, içinde $ veri listesini geçirerek. Ben ayrıştırmak için gittiğinizde

, uğraşıyorum:

$params = file_get_contents('php://input'); 

Ancak, ben hiçbir yere geçirilen değişkeni görmüyorum.

Herhangi bir tavsiye yardımcı olabilir, teşekkürler.

$input = file_get_contents('php://input'); 
parse_str($input, $params); 
print_r($params); 

Ayrıca saklamak zorunda kalabilirsiniz bu yüzden sadece bir kez okunabilir bazı durumlarda php://input içinde not:

+1

yerine genel amaçlı cURL uzantının bunun için [HTTP eklentisinin] (http://de.php.net/manual/en/book.http.php) kullanımı daha kolay olmaz? – Gordon

+0

hmm Bunu hiç bilmiyordum! bağlantı için teşekkürler. – john

+0

Yani '$ params' boş mu demek istiyorsun? –

cevap

3

$params = file_get_contents('php://input'); değeri, parse_str kullanmaya gerek bir dize olacaktır.

0

Kabul edilen yanıt, multipart/form-data için işe yaramaz, hayal kırıklığı nedeniyle kendi yöntemimi yazdım. Bu, dosya yüklemelerini ve çok boyutlu istekleri işler.

/** 
* @param string $formData Raw response request of type FormData 
* @param array $header Meta data for each part of the form data (optional) 
* @return array Processed form data 
*/ 
public function parse_form_data($formData, &$header) 
{ 
    $endOfFirstLine = strpos($formData, "\r\n"); 
    $boundary = substr($formData, 0, $endOfFirstLine); 
    // Split form-data into each entry 
    $parts = explode($boundary, $formData); 
    $return = []; 
    $header = []; 
    // Remove first and last (null) entries 
    array_shift($parts); 
    array_pop($parts); 
    foreach ($parts as $part) { 
     $endOfHead = strpos($part, "\r\n\r\n"); 
     $startOfBody = $endOfHead + 4; 
     $head = substr($part, 2, $endOfHead - 2); 
     $body = substr($part, $startOfBody, -2); 
     $headerParts = preg_split('#; |\r\n#', $head); 
     $key = null; 
     $thisHeader = []; 
     // Parse the mini headers, 
     // obtain the key 
     foreach ($headerParts as $headerPart) { 
      if (preg_match('#(.*)(=|:)(.*)#', $headerPart, $keyVal)) { 
       if ($keyVal[1] == "name") $key = substr($keyVal[3], 1, -1); 
       else { 
        if($keyVal[2] == "="){ 
         $thisHeader[$keyVal[1]] = substr($keyVal[3], 1, -1); 
        }else{ 
         $thisHeader[$keyVal[1]] = $keyVal[3]; 
        } 
       } 
      } 
     } 
     // If the key is multidimensional, 
     // generate multidimentional array 
     // based off of the parts 
     $nameParts = preg_split('#(?=\[.*\])#', $key); 
     if (count($nameParts) > 1) { 
      $current = &$return; 
      $currentHeader = &$header; 
      $l = count($nameParts); 
      for ($i = 0; $i < $l; $i++) { 
       // Strip array access tokens 
       $namePart = preg_replace('#[\[\]]#', "", $nameParts[$i]); 

       // If we are at the end of the depth of this entry, 
       // add data to array 
       if ($i == $l - 1) { 
        if (isset($thisHeader['filename'])) { 
         $filename = tempnam(sys_get_temp_dir(), "php"); 
         file_put_contents($filename, $body); 
         $current[$namePart] = [ 
          "name" => $thisHeader['filename'], 
          "type" => $thisHeader['Content-Type'], 
          "tmp_name" => $filename, 
          "error" => 0, 
          "size" => count($body) 
         ]; 
        } else { 
         $current[$namePart] = $body; 
        } 
        $currentHeader[$namePart] = $thisHeader; 
       } else { 
        // Advance into the array 
        if (!isset($current[$namePart])) { 
         $current[$namePart] = []; 
         $currentHeader[$namePart] = []; 
        } 
        $current = &$current[$namePart]; 
        $currentHeader = &$currentHeader[$namePart]; 
       } 
      } 
     } else { 
      if (isset($thisHeader['filename'])) { 
       $filename = tempnam(sys_get_temp_dir(), "php"); 
       file_put_contents($filename, $body); 
       $return[$key] = [ 
        "name" => $thisHeader['filename'], 
        "type" => $thisHeader['Content-Type'], 
        "tmp_name" => $filename, 
        "error" => 0, 
        "size" => count($body) 
       ]; 
      } else { 
       $return[$key] = $body; 
      } 
      $return[$key] = $body; 
      $header[$key] = $thisHeader; 
     } 

    } 
    return $return; 
} 
İlgili konular