【问题标题】:Laravel: GuzzleHttp-s response is string instead of an xmlLaravel:GuzzleHttp-s 响应是字符串而不是 xml
【发布时间】:2018-08-02 10:09:48
【问题描述】:

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

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

他们接受参数化的GET 请求

可能的参数:

  • 银行(可能的输入:bb、alianz、cib、花旗银行、commerz、erste、kdb、kh、mkb、oberbank、otp、raiffeisen、unicredit、volksbank、mnb、sopron、mfb、fhb)
  • 价值(可能的输入:英镑、澳元、丹麦克朗、日元、加元、挪威克朗、瑞士法郎、瑞典克朗、美元、捷克克朗、波兰兹罗提、欧元、HRK、RON、TRY)
  • YYYYMMDD 格式的数据(我们希望看到的数据的日期)
  • 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 会改变它们的位置。

【问题讨论】:

    标签: laravel api get request guzzle


    【解决方案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();  
    
        }
    
        }
    

    【讨论】:

      【解决方案2】:

      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;
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-18
        • 2017-09-02
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-18
        相关资源
        最近更新 更多