【问题标题】:Set Content-type header to Elasticsearch-php client将 Content-type 标头设置为 Elasticsearch-php 客户端
【发布时间】:2018-11-08 21:05:35
【问题描述】:

我正在尝试使用 Elasticsearch-php 5.0 版将搜索查询发送到 Elasticsearch 6.4.2。

从 5.0 到 6.0 的重大变化之一是存在“strict content type validation” 这意味着对 Elasticsearch 的请求必须使用“Content-type: application/json”标头发送。

为了添加这个标题,我尝试使用来自this thread的polyfractal的建议:

    $params = [
    'index' => $index,
    'type' => $mapping,
    'body' => $query,
    'client' => [
        'curl' => [CURLOPT_HTTPHEADER => array('Content-type: text/plain')]
        ]
    ];

    $res = $this->mESClient->search($params); // this is Elasticsearch/Client

    return $res;

但由于某种原因,当代码尝试执行curl_setopt_array() 时,我不断收到“注意:数组到字符串的转换”,并且请求是网络发送的。

请注意:当我删除 $params 数组的“客户端”部分时,Elasticsearch 会收到请求。

【问题讨论】:

  • 你试过'curl' => [CURLOPT_HTTPHEADER => ['Content-type: text/plain']]。 array 和 [] 都是相同的,但想检查 Guzzle 是否有不同的想法。 :-)

标签: php elasticsearch


【解决方案1】:

根据Version Matrix,处理ES>=6时应该使用elasticsearch-php 6.0。

elasticsearch-php 5.0 与 ElasticSearch 6 不兼容。

您提到的线程与 ES-PHP 1.x/2.x 相关,可能有不同的选项语法。这与您的情况无关,只是其中一个 cmets 说的和我上面说的一样。

仅供参考,如果您使用的是 Elasticsearch 6.0+,您还需要将 ES-PHP 客户端升级到 6.0 分支。 ES-PHP 6.0+ 自动设置内容类型头文件:fd3b0f1

【讨论】:

  • 问题在于elasticsearch-php 6.0需要php7,而我使用php5.6。
  • 也许你可以降级elasticsearch?
【解决方案2】:

发现问题。尝试使用 curl 设置 HTTP 标头并在 URL 中指定授权详细信息时,似乎存在一个错误的功能。

例如: https://用户名:密码@host:port

由于某种原因,客户端将 curl http 标头复制到其他 curl 选项(需要字符串而不是数组),因此,从 curl_setopt_array 引发的数组到字符串转换的异常。

当我从主机 URL 中删除授权详细信息并使用 curl 授权标头时,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2013-12-10
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多