Avatar billede bgolsen Juniormester
15. juni 2023 - 10:30 Der er 13 kommentarer og
1 løsning

file_get_contents lader til ikke altid at sende http requests

Hej

Jeg sidder med et lille mystisk problem.

Jeg skal sende og modtage data til et api. To requests jeg udfører fungerer fint, her sender jeg først noget login data og modtager nogle data til videre brug, og sender ændringer og modtager et response med nogle data.

Men de to sidste, ser ikke ud til at komme frem. Leverandøren kan se de første to i loggen, men ikke de to sidste. Når jeg prøver at smide url'erne ind i browseren, så får jeg den ventede fejl-response, og leverandøren kan se det i loggen.

Til at begynde med tænkte jeg at det kunne være en fejl i headeren jeg laver (som i dette tilfælde blot skal indeholde noget auth og info om at det er en post), men nu prøver jeg at skære helt ind til benet, blot for at få en respons.

Så min nuværende test er skåret ned til kun at indeholde:
$homepage = file_get_contents('https://dr.dk');
echo $homepage;

Når url'en er https://dr.dk får jeg, som ventet, dr's hjemmeside. Prøver jeg med de to url'er til api'et, kommer der ingenting. Ikke engang false.

Hvad kan være årsagen, og hvad kan jeg gøre for at afhjælpe det?

Mvh
bgolsen
Avatar billede repox Seniormester
15. juni 2023 - 11:23 #1
Det bliver kun ukvalificerede gæt, uden nogen som helst form for kode, til at give noget kontekst til det du oplever.
Avatar billede bgolsen Juniormester
15. juni 2023 - 11:36 #2
Ok:

$homepage = file_get_contents('https://dr.dk');
echo $homepage;

Virker

$homepage = file_get_contents('https://testapi.conlansite.site/locks/1jZdZE7JLfD9nHPO-mWDxERtIpdAio1H/get-day-code');
echo $homepage;

Virker ikke.

Det er skåret ind til kun dét, der er ikke mere kode.
Avatar billede repox Seniormester
15. juni 2023 - 12:02 #3
Hvad forventer API'et af metode, headers og parametre?
Avatar billede bgolsen Juniormester
15. juni 2023 - 12:17 #4
Med dén kode dér burde jeg få dette tilbage:

{"statusCode":405,"error":"Method Not Allowed","message":"Method Not Allowed"}

Det gør jeg ikke.

Hvis jeg giver den hvad den forventer, en simpel post med en auth header med en bearer token (som jeg ikke kan vise her), så bruger jeg denne kode:

$originurl = "https://testapi.conlansite.site/locks/1jZdZE7JLfD9nHPO-mWDxERtIpdAio1H/get-day-code/";
$url =  urldecode( $originurl );
   
$opts = array(
    'http'=>array(
        'method'=>"POST",
        'content'=>"",
        'header'=>"Authorization: Bearer $bearertoken\r\n"
        )
    );
$context = stream_context_create($opts);
$jsonstr = file_get_contents ( $url, false, $context );
$daycoderesponse = json_decode($jsonstr);

print_r($opts);
echo "<br><br>\r\n\r\n";
echo $jsonstr;
echo "<br><br>\r\n\r\n";
echo $daycoderesponse;

Og der får jeg heller ingenting tilbage - og jeg får at vide at der slet ikke dukker noget op i loggen. Han fortalte at han i loggen godt kunne se når jeg blot smed url'en ind i browseren. Så det virker som om requesten slet ikke "kommer ud af huset"
Avatar billede bgolsen Juniormester
15. juni 2023 - 12:19 #5
Skal lige sige, at for sjov har jeg prøvet med og uden 'content'=>"", - der skal ikke være noget content
Avatar billede supportsiden Professor
15. juni 2023 - 12:37 #6
Avatar billede repox Seniormester
15. juni 2023 - 14:01 #7
Hvorfor bruger du ikke Guzzle? Eller som minimum bare cURL?

Jeg tænker det er mangelfulde headers der er problemet, men det kan være svært at svare på fyldestgørende uden at vide hvad API'et forventer.
Avatar billede arne_v Ekspert
15. juni 2023 - 15:09 #8
file_get_contents er jo som navnet antyder et file API (med support for HTTP) ikke et HTTP API.

Det gør fejlsøgning lidt tricky.

En mulighed er at droppe file_get_contents og skifte til Curl/Guzzle/Requests/whatever.

En anden mulighed er at fange hvad der faktisk bliver sendt i request og sendt tilbage i response.

Der er findes værktøjer som kan gøre det.

Hvis du kan se HTTP request og HTTP response så kan du formentligt løse problemet.
Avatar billede erikjacobsen Ekspert
15. juni 2023 - 16:33 #9
Hvorfor laver du en urlencode?
Avatar billede erikjacobsen Ekspert
15. juni 2023 - 16:38 #10
Ok, ja, vel, der står urldecode - jeg sku' lige finde brillerne frem. Lige i dette tilfælde, med denne streng, gør den ingenting.
Avatar billede erikjacobsen Ekspert
15. juni 2023 - 16:58 #11
Uden helt at vide hvad der foregår får jeg et lidt andet resultat med:

    'header'=>"Authorization: Bearer $bearertoken\r\nContent-Length: 0\r\n"
Avatar billede bgolsen Juniormester
16. juni 2023 - 08:47 #12
erikjacobsen, det var lige dét der skulle til :)

Jeg havde fået lavet den første uden Content-Length, og det virkede, så jeg formodede at den reelt ikke var absolut nødvendig. Men det lader til at den ikke vil sende requesten uden en body hvis ikke Content-Length er sat til 0.

Tak for hjælpen til alle :)
Avatar billede erikjacobsen Ekspert
16. juni 2023 - 12:32 #13
Kan det passe at din PHP har advarsler og/eller fejl slået fra, så du ikke så beskeden om manglende content-length? Den tjeneste kører vistnok med HTTP/1.0, som vistnok kræver en content-length.
Avatar billede bgolsen Juniormester
16. juni 2023 - 15:03 #14
Ja, det er slået fra. Hosten giver ikke mulighed for at slå det til, og det er fint nok, så ender man ikke med at slå det fra igen ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester