Search code examples
phpjsonresthadoophbase

How to send filters parameters in JSON request to HBase REST API?


I'm trying to develop a PHP client to interact with HBase REST API. But I can't find the way to create scanner using JSON request. All examples I could find are using XML format. Just wonder if it's possible to send using JSON format.

The code below returned error message: "HTTP/1.1 500 Can not deserialize instance of java.lang.String out of START_ARRAY token"

<?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);
}

Solution

  • I got the answer by other's hint:

    <?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);
    }