【问题标题】:Make POST JSon requests to HBase REST by CURL with PHP使用 PHP 通过 CURL 向 HBase REST 发出 POST JSON 请求
【发布时间】:2016-01-03 23:03:39
【问题描述】:

[已解决] 我在 Ubuntu 14 上有一个 HBase 1.1.2 独立安装,我需要通过 REST 服务器通过 PHP POST 请求(由于长度限制我不能使用 GET)来检索和更新数据。我打算使用 curl PHP 对象,但我的问题是我不明白如何格式化要在 REST 服务器的 POST 中提交的请求(以 JSON 或 XML 格式)。

谁能帮帮我?

谢谢

让我添加我想用于所有请求的对象:按键获取行并设置\创建行。我的问题是如何根据不同的操作创建 $DATA 字段。

function method($method, $data=NULL, & $http_code, & $response)
{
    $ch = curl_init();

    if(isset($header))
    {
        curl_setop(CURLOPT_HTTPHEADER, $header);
    }

    curl_setopt($ch, CURLOPT_URL, "http://" . $GLOBALS['DBDW']['hostname'] . $GLOBALS['DBDW']['port']);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    //nuovi
    curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($curl, CURLOPT_HEADER, 1);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json',
            'Accept: application/json',
            'Connection: ' . ( $this->options['alive'] ? 'Keep-Alive' : 'Close' ),
    ));
    // fine nuovi

    switch(strtoupper($method)){
        case 'DELETE':
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
            // i have to set CURLOPT_POSTFIELDS and if yes how?             
            break;
        case 'POST':
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            // how setting CURLOPT_POSTFIELDS and if yes how?

            break;
        case 'GET':
            curl_setopt($curl, CURLOPT_HTTPGET, 1);
            // i have to set CURLOPT_POSTFIELDS and if yes how?
            break;
    }


    $response = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $this->log(LOG_DEBUG, "HTTP code: " . $http_code, __FILE__, __LINE__, __CLASS__);

    $curl_errno = curl_errno($ch);
    $curl_error = curl_error($ch);

    curl_close($ch);

    if ($response === false)
    {
        $this->log(LOG_ERR, "HTTP " . $method . " failed on url '" . $url . "'", __FILE__, __LINE__, __CLASS__);
        $this->log(LOG_ERR, "cURL error: " . $curl_errno . ":" . $curl_error, __FILE__, __LINE__, __CLASS__);
        $http_code=ERR_COMMUNICATION_FAILED;
        return false;
    }

    return true;
}

【问题讨论】:

  • 到目前为止你尝试过什么?分享一些代码。还是您希望从头开始编写代码?
  • 是的,您的 php 代码中是否已经表示了数据?您有一些想要转移到 JSON 表示的变量?
  • 这个所谓的 $DATA 变量在哪里?
  • $data 是我想用 Json 请求填充的变量。我不知道每种情况的要求是什么。
  • $DATA 与 $data 不同

标签: php json rest curl hbase


【解决方案1】:

CURLOPT_POSTFIELDS 仅在您使用 post 时才需要,因此您的 switch/case 是正确的。

如果您想发出 GET 请求,只需将 GET 内容附加到 url,就像您在浏览器中看到的一样。这个功能很方便:http_build_query

// define the url in a variable above the switch
$url = "http://" . $GLOBALS['DBDW']['hostname'] . $GLOBALS['DBDW']['port'];
switch(strtoupper($method)){
    case 'DELETE':
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');  
        // append the GET parameters if any
        if(!empty($data)) $url .= "?".http_build_query($data);
        break;
    case 'POST':
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        break;
    case 'GET':
        curl_setopt($curl, CURLOPT_HTTPGET, 1);
        // append the GET parameters if any
        if(!empty($data)) $url .= "?".http_build_query($data);
        break;
}
// move this line below the switch
curl_setopt($ch, CURLOPT_URL, $url);

This is the function I use for cURL stuff。如果你愿意,你可以参考它(或使用它)。

【讨论】:

  • 亲爱的 Pamblam,感谢您的回复。我真正的问题是我不知道我必须使用什么 Json 语义来通过 hbase 获取数据或将行添加/更新到 hbase。有什么建议吗?
  • 亲爱的,我不知道hbase是什么,所以暂时不建议
猜你喜欢
  • 2014-07-28
  • 1970-01-01
  • 2011-10-24
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多