【问题标题】:How to send filters parameters in JSON request to HBase REST API?如何将 JSON 请求中的过滤器参数发送到 HBase REST API?
【发布时间】:2017-03-14 09:39:54
【问题描述】:

我正在尝试开发一个 PHP 客户端来与 HBase REST API 交互。但我找不到使用 JSON 请求创建扫描仪的方法。我能找到的所有示例都使用 XML 格式。只是想知道是否可以使用 JSON 格式发送。

下面的代码返回错误信息: “HTTP/1.1 500 无法从 START_ARRAY 令牌中反序列化 java.lang.String 的实例”

<?php

$headers = array(
    'Accept: application/json',
    'Content-Type: application/json',
);

if (!file_exists(__DIR__ . '/tmp')) {
    mkdir(__DIR__ . '/tmp', 0777);
}

$scannerFile = __DIR__ . '/tmp/scanner';

if (!file_exists($scannerFile)) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, "http://hbase_uri:20550/news/scanner");
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);
    curl_setopt($ch, CURLOPT_USERPWD, ":");

    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array(
        'batch' => 10,
        'filter' => array(
            array(
                'type' => 'PrefixFilter',
                'value' => 'u123',
            ),
        ),
    )));

    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $page = curl_exec($ch);

    file_put_contents($scannerFile, $page);

    curl_close($ch);
} else {
    $s = file_get_contents($scannerFile);
    $parts = explode('Location: http://hbase_uri:20550/news/scanner/', $s);
    $parts = explode("\n", $parts[1]);
    $parts[0] = trim($parts[0]);
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, "http://hbase_uri:20550/news/scanner/" . $parts[0]);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);
    curl_setopt($ch, CURLOPT_USERPWD, ":");

    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $page = curl_exec($ch);

    file_put_contents(__DIR__ . '/tmp/result', $page);

    curl_close($ch);


    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, "http://hbase_uri:20550/news/scanner/" . $parts[0]);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);
    curl_setopt($ch, CURLOPT_USERPWD, ":");

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');

    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $page = curl_exec($ch);

    file_put_contents(__DIR__ . '/tmp/result_delete', $page);

    curl_close($ch);
}

【问题讨论】:

    标签: php json rest hadoop hbase


    【解决方案1】:

    为未来的访客。

    使用@kiang 回答我已经成功创建了一个 CURL POST 创建扫描仪:

    curl \
      --verbose \
      --request POST \
      --header 'Accept: application/json' \
      --header 'Content-Type: application/json' \
      --data '{"batch":10,"filter":"{\"type\":\"PrefixFilter\",\"value\":\"u123\"}"}' \
      'https://hbase:20550/namespace:table/scanner/'
    

    这返回了

    Location -> Buffer(https://hbase:20550/namespace:table/scanner/151302168977413777789)
    ...
    AhcWSResponse(StandaloneAhcWSResponse(201, Created))
    

    什么可能有用:

    【讨论】:

      【解决方案2】:

      我通过别人的提示得到了答案:

      <?php
      
      $headers = array(
          'Accept: application/json',
          'Content-Type: application/json',
      );
      
      if (!file_exists(__DIR__ . '/tmp')) {
          mkdir(__DIR__ . '/tmp', 0777);
      }
      
      $scannerFile = __DIR__ . '/tmp/scanner';
      
      if (!file_exists($scannerFile)) {
          $ch = curl_init();
      
          curl_setopt($ch, CURLOPT_URL, "http://hbase_uri:20550/news/scanner");
          curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
          curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);
          curl_setopt($ch, CURLOPT_USERPWD, ":");
      
          curl_setopt($ch, CURLOPT_POST, true);
          curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array(
              'batch' => 10,
              'filter' => json_encode(array(
                  'type' => 'PrefixFilter',
                  'value' => 'u123',
              )),
          )));
      
          curl_setopt($ch, CURLOPT_HEADER, 1);
          curl_setopt($ch, CURLOPT_VERBOSE, 1);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      
          $page = curl_exec($ch);
      
          file_put_contents($scannerFile, $page);
      
          curl_close($ch);
      } else {
          $s = file_get_contents($scannerFile);
          $parts = explode('Location: http://hbase_uri:20550/news/scanner/', $s);
          $parts = explode("\n", $parts[1]);
          $parts[0] = trim($parts[0]);
          $ch = curl_init();
      
          curl_setopt($ch, CURLOPT_URL, "http://hbase_uri:20550/news/scanner/" . $parts[0]);
          curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
          curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);
          curl_setopt($ch, CURLOPT_USERPWD, ":");
      
          curl_setopt($ch, CURLOPT_HEADER, 1);
          curl_setopt($ch, CURLOPT_VERBOSE, 1);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      
          $page = curl_exec($ch);
      
          file_put_contents(__DIR__ . '/tmp/result', $page);
      
          curl_close($ch);
      
      
          $ch = curl_init();
      
          curl_setopt($ch, CURLOPT_URL, "http://hbase_uri:20550/news/scanner/" . $parts[0]);
          curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
          curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);
          curl_setopt($ch, CURLOPT_USERPWD, ":");
      
          curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
      
          curl_setopt($ch, CURLOPT_HEADER, 1);
          curl_setopt($ch, CURLOPT_VERBOSE, 1);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      
          $page = curl_exec($ch);
      
          file_put_contents(__DIR__ . '/tmp/result_delete', $page);
      
          curl_close($ch);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 2018-10-29
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多