Laravel:GuzzleHttp-s响应是字符串而不是xml

时间:2018-02-22 14:08:05

标签: laravel api get request guzzle

我正在修改GuzzleHTTP和API请求。我正在使用Napiarfolyam.hu进行测试。他们收集不同银行的不同Valuta的汇率。

他们的API地址:http://api.napiarfolyam.hu

他们接受参数化GET请求

可能的参数:

  • 银行(可能的输入:bb,allianz,cib,citibank,commerz,erste,kdb,kh,mkb,oberbank,otp,raiffeisen,unicredit,volksbank,mnb,sopron,mfb,fhb)
  • valuta(可能输入:GBP,AUD,DKK,JPY,CAD,NOK,CHF,SEK,USD,CZK,PLN,EUR,HRK,RON,TRY)
  • 以YYYYMMDD格式显示的数据(我们想要查看的数据的日期)
  • datumend(如果我们使用它,我们将以yYYYMMDD格式获得基准数据库中的汇率)
  • valutanem(可能输入valuta,deviza。我们可以用它来缩小结果)

他们说他们的输出应该是这样的:

<arfolyam>
  <valuta>
    <item>
      <bank>bank rövidítése</bank>//The bank's short name
      <datum>mikor kapta ezt az értéket</datum>//Date
      <penznem>pénznem kódja</penznem>//Currency
      <vetel>árfolyam 1 egységre</vetel>//BuyPrice
      <eladas>árfolyam 1 egységre</eladas>//SellPrce
    </item>
  </valuta>
  <deviza>
    <item>
      <bank>bank rövidítése</bank>//The bank's short name
      <datum>mikor kapta ezt az értéket</datum>//date
      <penznem>pénznem kódja</penznem>//Currency
      <vetel>árfolyam 1 egységre</vetel>//Buyprice
      <eladas>árfolyam 1 egységre</eladas>//Sellprice
      <kozep>árfolyam 1 egységre</kozep>//Middleprice only when the bank is MNB
    </item>
  </deviza>
</arfolyam>

我的控制器到目前为止:

<?php

namespace App\Http\Controllers;

use DB;
use Carbon\Carbon;
use GuzzleHttp\Client;

class ValutaController extends Controller {

    public function getValuta($bankName = '', $valuta = ''){

        $client = new Client();
        $response = $client->request('GET', "http://api.napiarfolyam.hu?bank={$bankName}&valuta={$valuta}");

        $body = $response->getBody();  

    }

}

我的问题:$bodystring而不是xml。为什么呢?

最好是xmlarray,因为我看到有时BuyPriceSellPrice改变了位置。

2 个答案:

答案 0 :(得分:1)

Guzzle不会对响应执行任何转换,它会将响应作为字符串返回给您,以便您执行所需的任何处理。

如果您想要获取一串XML并将其转换为对象,那么您可以使用simplexml_load_string,例如:

<?php

namespace App\Http\Controllers;

use DB;
use Carbon\Carbon;
use GuzzleHttp\Client;

class ValutaController extends Controller {

    public function getValuta($bankName = '', $valuta = ''){

        $client = new Client();
        $response = $client->request('GET', "http://api.napiarfolyam.hu?bank={$bankName}&valuta={$valuta}");

        $data = simplxml_load_string($response->getBody());  

        return $data->valuta->item->vetel;
    }

}

答案 1 :(得分:1)

您可以调用Guzzle内置的xml()函数,

http://guzzle3.readthedocs.io/http-client/response.html#xml-responses

  

您可以使用响应的xml()方法轻松解析XML响应并将其用作SimpleXMLElement对象。如果响应是有效的XML或响应主体为空,则此方法将始终返回SimpleXMLElement对象。如果调用此方法并且响应不是有效的XML,则会出现异常。

这是您更新的代码

<?php

namespace App\Http\Controllers;

use DB;
use Carbon\Carbon;
use GuzzleHttp\Client;

    class ValutaController extends Controller {

    public function getValuta($bankName = '', $valuta = ''){

        $client = new Client();
        $response = $client->request('GET', "http://api.napiarfolyam.hu?bank={$bankName}&valuta={$valuta}");

        $body = $response->xml();  

    }

    }