如何将 JSON 请求中的过滤器参数发送到 HBase REST API?
How to send filters parameters in JSON request to HBase REST API?
我正在尝试开发一个 PHP 客户端来与 HBase REST API 进行交互。但是我找不到使用 JSON 请求创建扫描仪的方法。我能找到的所有示例都使用 XML 格式。只是想知道是否可以使用 JSON 格式发送。
下面的代码返回错误信息:
"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);
}
我通过别人的提示得到了答案:
<?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);
}
为了未来的访客。
使用@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))
可能有用的内容:
- 使用那些 examples(你需要转义
"
标志)
- 找到 docs of ScannerModel。
我正在尝试开发一个 PHP 客户端来与 HBase REST API 进行交互。但是我找不到使用 JSON 请求创建扫描仪的方法。我能找到的所有示例都使用 XML 格式。只是想知道是否可以使用 JSON 格式发送。
下面的代码返回错误信息: "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);
}
我通过别人的提示得到了答案:
<?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);
}
为了未来的访客。
使用@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))
可能有用的内容:
- 使用那些 examples(你需要转义
"
标志) - 找到 docs of ScannerModel。