2016-11-01 9 views
2

私はHBase REST APIと対話するPHPクライアントを開発しようとしています。しかし、私はJSON要求を使用してスキャナを作成する方法を見つけることができません。私が見つけることができるすべての例は、XML形式を使用しています。 JSON形式で送信できるかどうか疑問に思うだけです。JSONリクエストのフィルタパラメータをHBase REST APIに送信するにはどうすればよいですか?

コードの下に返されるエラーメッセージ: "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); 
} 

答えて

1

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

将来の訪問者のために。 @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
関連する問題