【问题标题】:How to retrieve XML using guzzle如何使用 guzzle 检索 XML
【发布时间】:2020-04-02 23:18:48
【问题描述】:

我想从某个 url 检索响应,但该 URL 使用 xml 返回它的响应。有没有办法使用 Guzzle 检索此响应?在 Guzzle 5.3 中,我们可以轻松地做类似的事情

$response->xml()

因此这将解析 xml 内容。现在,当我尝试在 Guzzle 6.2 中使用相同的代码时,它不再工作了。下面是我的代码

$response = $client->get($this->url);
$resp = $response->xml();

但这不起作用。我也在下面尝试过

$response = $client->get($this->url);
$response = $response->getBody()->getContents();
$responseXml = simplexml_load_string($response);
if ($responseXml instanceof \SimpleXMLElement)
{
   $key_value = (string)$responseXml->key_name;
   return $key_value;
 }

但这不起作用。关于如何检索 xml 数据的任何想法?

【问题讨论】:

  • 你的错误是什么?
  • 抱歉弄错了。将发布我的答案

标签: laravel guzzle6 guzzle


【解决方案1】:

想通了。原来我只需要添加

'接受' => '应用程序/json'

到我的请求的标头参数。然后我可以解码xml,如下面的代码所示

$provider_type = 'application/xml';

$param_data = [
   'headers' => [
      'Accept' => $provider_type,
   ]
];
$response = $this->client->get($this->url, $param_data);            
$response = $response->getBody()->getContents();

    switch ($provider_type) {
        case 'application/xml':
            $encode_response = json_encode(simplexml_load_string($response));   

            $decode_response = json_decode($encode_response, TRUE);
            return $decode_response;

        default: // Response json
            $encode_response = json_encode($response);   

            $decode_response = json_decode($encode_response, TRUE);
            return json_decode($decode_response, TRUE);                

    }

【讨论】:

  • 看起来你正在从 xml 到 json 到关联数组......可能想看看 xpath。从 xml 中提取数据的真正好方法。 xpath 提供了一个元素选择器系统,有点像 css 选择器隔离节点。
  • @TarekAdam 是的,这里的真正目的是创建一个可以处理任何端点的类,而无需在数据提供者响应更改时更改代码。如果端点更改为 xml,则该类应该能够支持它并且不会影响代码。我认为的解决方案是从 XML 将其转换回 JSOn,然后再转换为关联数组,这样实现与具有 json 响应的数据提供者相同
猜你喜欢
  • 2018-10-12
  • 2015-10-25
  • 2017-12-14
  • 2019-12-27
  • 2012-07-28
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 2019-10-23
相关资源
最近更新 更多