Estoy jugando con las solicitudes de API y GuzzleHTTP. Estoy probando con Napiarfolyam.hu. Recogen los tipos de cambio de diferentes Valuta en diferentes Bancos.

Su dirección de API: http://api.napiarfolyam.hu

Ellas aceptan solicitudes GET parametrizadas

Posibles parámetros:

  • bank (entradas posibles: bb, allianz, cib, citibank, commerz, erste, kdb, kh, mkb, oberbank, otp, raiffeisen, unicredit, volksbank, mnb, sopron, mfb, fhb)
  • valuta (posibles entradas: GBP, AUD, DKK, JPY, CAD, NOK, CHF, SEK, USD, CZK, PLN, EUR, HRK, RON, TRY)
  • datum (la fecha de la información que queremos ver) en formato AAAAMMDD
  • datumend (si lo usamos obtendremos los tipos de cambio en datum-datumend intervall) en formato AAAAMMDD
  • valutanem (posibles entradas valuta, deviza. Podemos acotar los resultados con él)

Dicen que su salida debería ser esta:

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

Mi controladora hasta ahora:

<?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();  

    }

}

Mi problema: $body es un string y no un xml. ¿Por qué?

Sería mejor como xml o array porque mientras jugaba vi que a veces BuyPrice y SellPrice cambian de lugar.

0
Feralheart 22 feb. 2018 a las 17:08

2 respuestas

La mejor respuesta

Puede llamar a la función xml() incorporada de Guzzle,

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

Puede analizar y utilizar fácilmente una respuesta XML como objeto SimpleXMLElement utilizando el método xml () de una respuesta. Este método siempre devolverá un objeto SimpleXMLElement si la respuesta es XML válido o si el cuerpo de la respuesta está vacío. Obtendrá una excepción si llama a este método y la respuesta no es XML válido.

Aquí está tu código actualizado

<?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();  

    }

    }
1
Faraz Irfan 22 feb. 2018 a las 17:23

Guzzle no realiza ninguna conversión en la respuesta, le devuelve la respuesta como una cadena lista para que realice cualquier procesamiento que necesite.

Si desea tomar una cadena de XML y convertirla en un objeto, puede utilizar simplexml_load_string, por ejemplo:

<?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
sam 22 feb. 2018 a las 15:27