从PHP请求对couchdb的POST请求

时间:2018-03-13 09:37:15

标签: php database rest nosql couchdb

尝试从php程序向couchdb添加文档。 我想使用couchdb自动生成的uuid作为密钥。 以下代码给出错误

CONTENT TYPE MUST BE APPLICATION/JSON
  $couch = new CouchSimple();
  $resp=$couch->send("POST",'/aaa-stores','{"foo":"bar"}');
  $json=json_decode($resp);
  if(isset($json->{'error'}))
        {
         echo $json->{'reason'};
        }



class CouchSimple {

   private $host = "localhost" ,$port = 5984,$user=" ",$pass =" ";

function send($method, $url, $post_data = NULL)
{
    $s = fsockopen($this->host, $this->port, $errno, $errstr);
    if(!$s) {
        echo "$errno: $errstr\n";
         return false;
    }
   $request = "$method $url HTTP/1.0\r\nHost: $this->host\r\n";
   if ($this->user) 
      {        
        $request .= "Authorization: Basic ".base64_encode("$this->user :$this->pass")."\r\n";
      }
 if($post_data) {
    $request .= "Content-Length: ".strlen($post_data)."\r\n\r\n";
    $request .= 'Content-Type: application/json'."\r\n\r\n";
    $request .= "$post_data\r\n";
    }
else {
    $request .= "\r\n";
     }
fwrite($s, $request);
$response = "";
while(!feof($s)) {
    $response .= fgets($s);
}
 list($this->headers, $this->body) = explode("\r\n\r\n", $response);
 return $this->body;

}

1 个答案:

答案 0 :(得分:2)

这里有几个选项。您可以尝试使用CouchDB库(例如https://github.com/ibm-watson-data-lab/php-couchdb - 免责声明,我是该项目的维护者)。

至少可以为PHP使用功能更全面的HTTP库,例如Guzzle(http://guzzlephp.org/)。这样可以更轻松地添加标头并对主体进行编码,而无需从PHP代码输出原始HTTP。这是一篇博客文章,展示了如何使用Guzzle与PHP中的CouchDB交流,这可能也会有所帮助:https://developer.ibm.com/clouddataservices/2016/07/27/get-started-with-couchdb-php-guzzle/

最后提示:尝试使用http://requestb.in获取用于测试您发送的请求的URL - 根据我的经验,它确实有助于调试此类事情。