OOP curl class

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jorn Reed

Jorn Reed

19/10/2021 12:00:09
Quote Anchor link
Hoi iedereen,
Ik ben laatst begonnen met voor het eerst curl te gebruiken in PHP.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$headers = [
                "Content-Type: application/json",
                "Accept: application/json",
                "X-API-TOKEN: ".$token,
                "Connection: keep-alive",
            ];
            
            $body = [
                'FirstName'             => $result['inputs']['fname'],
                'MiddleName'            => $result['inputs']['prefix'],
                'LastName'                 => $result['inputs']['lname'],
                'Email'                    => $result['inputs']['email'],
                'PhonePrivate'            => $result['inputs']['phone'],
                'Gender'                => $result['inputs']['sex'],
                'Zipcode'                => $result['inputs']['zipcode'],
                'City'                    => $result['inputs']['place'],
                'Address'                => $result['inputs']['street'],
                'HouseNumber'            => $result['inputs']['housenumber'],
                'HouseNumberExtension'     => $result['inputs']['addition'],
                'BirthDate'                => $result['inputs']['birthdate'],
                'Language'                => $result['inputs']['language'],
            ];
                
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL             => 'https://www.sportivity.com/sportivity-api/Customers',
                CURLOPT_RETURNTRANSFER     => true, //Return output instead of printing it.
                CURLOPT_HTTPHEADER        => $headers,
                CURLOPT_POST             => true,
                CURLOPT_POSTFIELDS         => json_encode($body, JSON_FORCE_OBJECT),
                CURLOPT_SSL_VERIFYPEER     => false,
                CURLOPT_SSl_VERIFYHOST     => false,)
            );
            
            $result['response'] = curl_exec($curl);
            $result['errors'] = [];
             curl_close($curl);
            echo json_encode($result['response']);


Deze code word geactiveerd op het moment dat alle formulier velden correct zijn ingevuld.
Als response krijg ik de input velden terug inclusief een customer_id. wat goed is.

Ik vond dit alleen slordig en probeerde het in een class te maken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
class Api {
    protected $base_url = 'https://www.sportivity.com/sportivity-api';
    protected $token;
    
    public function __construct($token){
        $this->token = $token;
    }

    
    protected function getHeaders(){
        return [
            "Content-Type: application/json",
            "Accept: application/json",
            "X-API-TOKEN: ".$this->token,
            "Connection: keep-alive",
        ];
    }

    
    public function prepareApi($url){
        $curl = curl_init();
        
        curl_setopt($curl, CURLOPT_URL, $this->base_url.$url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $this->getHeaders());
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        
        $response = curl_exec($curl);
        curl_close($curl);
        
        return json_decode($response);
    }

    
    public function sendPostRequest($url, $body)
    {

        return $this->postRequest($url, $body);
    }


    
    private function postRequest($url, $body){
        $curl = curl_init;
        
        curl_setopt_array($curl, $this->getCurlPostOptions($url, $body));
        $response = curl_exec($curl);
        curl_close($curl);
        return json_encode($response);
    }

    
    private function getCurlPostOptions($url, $body){
        return [
            CURLOPT_URL             => $this->base_url.$url,
            CURLOPT_RETURNTRANSFER     => true, //Return output instead of printing it.
            CURLOPT_HTTPHEADER        => $this->getHeaders(),
            CURLOPT_POST             => true,
            CURLOPT_POSTFIELDS         => json_encode($body, JSON_FORCE_OBJECT),
            CURLOPT_SSL_VERIFYPEER     => false,
            CURLOPT_SSl_VERIFYHOST     => false,
            
        ];
    }

    
    public function getLocations(){
        return $this->prepareApi('/Locations');
    }
    
    
    public function getSubscriptions(){
        return $this->prepareApi('/MembershipDefinition');
    }
}


// $api = new Api();
// $test = $api->getLocations();
// var_dump($test->LocationResources);

?>

Vervolgens probeer ik de data dus zo op te halen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$api = new Api($token);
$result['response'] = $api->sendPostRequest('/Customers', $body);

Helaas krijg ik een response: "null" terug en weet ik niet waar dat aan ligt.

Toevoeging op 19/10/2021 12:04:11:

Vervolgens doe ik eigenlijk nog

echo $result;

wat dus in jquery met een ajax request word opgehaald en JSON.parse() op het result
 
PHP hulp

PHP hulp

05/12/2021 00:24:38
 
Ward van der Put
Moderator

Ward van der Put

19/10/2021 12:27:55
Quote Anchor link
Ik zie twee keer een curl_close(): die in prepareApi() sluit waarschijnlijk vroegtijdig de verbinding.
 
Jorn Reed

Jorn Reed

19/10/2021 12:34:38
Quote Anchor link
Ward van der Put op 19/10/2021 12:27:55:
Ik zie twee keer een curl_close(): die in prepareApi() sluit waarschijnlijk vroegtijdig de verbinding.


PrepareApi() is een oudere functie, die gebruik ik om alle subscriptions te tonen, kan het zo zijn dat hij vanwege de zelfde variabel naam de verbinding al sluit voordat ik die post request doe? Want in die post request open ik de verbinding bewijze van opnieuw.


Toevoeging op 19/10/2021 12:38:43:

Ward van der Put op 19/10/2021 12:27:55:
Ik zie twee keer een curl_close(): die in prepareApi() sluit waarschijnlijk vroegtijdig de verbinding.


ik had even de curl_close weggehaald, maar dat maakt geen verschil. Als ik het object in de console.log bekijk in jquery dan zie ik dat 'response' ="null"
 
Ozzie PHP

Ozzie PHP

19/10/2021 12:50:16
Quote Anchor link
$test->LocationResources

Waar komt die LocationResources vandaan?
 
Jorn Reed

Jorn Reed

19/10/2021 12:53:34
Quote Anchor link
Ozzie PHP op 19/10/2021 12:50:16:
$test->LocationResources

Waar komt die LocationResources vandaan?


Oh let maar niet op die call hoor. In ieder geval als je de locations ophaalde dan zaten ze in de ->locationResources. Vandaar dat ik dat een keer dumpte

Toevoeging op 19/10/2021 14:01:09:

stom foutje van mij. Ik vergat bij curl_init de () haha

Toevoeging op 19/10/2021 16:22:16:

Ik loop alleen tegen een ander probleem aan. Zodra ik de Post request maak, dan komt het in dit object
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$result['response'] = $call->sendPostRequest('/Customers', $body);

Dit object wordt vervolgens ge-echoed in een json_encode, en in de front end met jquery opgehaald. Het toont alle waardes die naar de API zijn gestuurd + een aangemaakt CustomerID. Alleen krijg ik het niet voor elkaar om het CustomerId in de PHP goed te ontvangen, ik heb die namelijk nodig voor een 2e api call. Het werkt allemaal een beetje gek omdat ik steeds met jquery een ajax call maak naar een php functie die met een WordPress ajax action word aangeroepen. Ik weet niet of iemand daar ervaring mee heeft?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.