Matt
Matt

Reputation: 29

Send form data to webservice curl()

that's my php function that connect to a webservice where I'm passing static data to recive a result back:

function calculate(){

    if(isset($_POST['calculate-button'])){
        session_start(); 
        $ch = curl_init();
        $input1 = '{"input": {
                        "IDCompany": "CLM",
                        "IDLanguage": "EN",
                        "IDWsType": "1",    
                        "Item_Input": 6,
                        "Input_Parm": [
                    {
                        "type_param" : "char", 
                        "lenght_param" : 3, 
                        "param" : "004"
                },
                {   "tipo_param" : "num", 
                    "lenght_param" : 10.0, 
                     "param" : "150" 
                },
                {   "tipo_param" : "num", 
                    "lenght_param" : 10.0, 
                    "param" : "250" 
                },
                {
                    "tipo_param" : "num", 
                    "lenght_param" : 10.0, 
                    "param" : "10" 
                },
                {
                    "tipo_param" : "num", 
                    "lenght_param" : 10.0, 
                    "param" : "5" 
                },  
                {
                    "tipo_param" : "num", 
                    "lenght_param" : 10.0, 
                    "param" : "260" 
                }       
            ]
       }

    }';           

    $headers = array();
    $input2 = array('code' => '000001');
    $headers[] = 'Content-Type:application/json';

    curl_setopt($ch,CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch,CURLOPT_URL, 'https://urltowebservice');        
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, TRUE);  
    curl_setopt($ch,CURLOPT_CUSTOMREQUEST, 'POST'); 
    curl_setopt($ch,CURLOPT_POSTFIELDS, $input1);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);   
    curl_setopt($ch, CURLOPT_TIMEOUT, 60); // Timeout in seconds;   

    $result = curl_exec($ch);
    if (curl_errno($ch)) {
        echo 'Error:' . curl_error($ch);
        var_dump($ch);
    }   
    curl_close($ch);
    echo var_dump(json_decode($result, true));
}

This display correctly the results form webservice. It repsponds with a number and the product that should be purchased. What i'm trying to do now is to pass variables coming from a php form:

function calculate(){

    if(isset($_POST['calculate-button'])){
        session_start(); 
        $ch = curl_init();
        // variable from html form
        $product = $_POST['product'];
        $lenght = $_POST['lenght'];
        $width = $_POST['width'];
        $depth = $_POST['depth'];
        $perimeter = $_POST['perimeter'];
        $area = $_POST['area'];

        $input1 = '{
         "input": {
              "IDCompany": "CLM",
              "IDLanguage": "EN",
              "IDWsType": "1",  
              "Item_Input": 6,
              "Input_Parm": [
                { "type_param" : "char", 
                    "lenght_param" : 3,
                    "param" : "$product"
                },
                {
                    "tipo_param" : "num", 
                    "lenght_param" : 10.0, 
                    "param" : "$lenght" 
                },
                {
                    "tipo_param" : "num", 
                    "lenght_param" : 10.0, 
                    "param" : "$width" 
                },
                {
                    "tipo_param" : "num", 
                    "lenght_param" : 10.0, 
                    "param" : "$depth" 
                },
                {
                    "tipo_param" : "num", 
                    "lenght_param" : 10.0, 
                    "param" : "$perimeter" 
                },  
                {
                    "tipo_param" : "num", 
                    "lenght_param" : 10.0, 
                    "param" : "$area" 
                }       
            ]
        }
    }';           

        $headers = array();
        $input2 = array('code' => '000001');
        $headers[] = 'Content-Type:application/json';
    
        curl_setopt($ch,CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch,CURLOPT_URL, 'https://urltowebservice');        
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, TRUE);  
        curl_setopt($ch,CURLOPT_CUSTOMREQUEST, 'POST'); 
        curl_setopt($ch,CURLOPT_POSTFIELDS, $input1);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false); 
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);   
        curl_setopt($ch, CURLOPT_TIMEOUT, 60); // Timeout in seconds;   
    
        
        $result = curl_exec($ch);
        if (curl_errno($ch)) {
            echo 'Error:' . curl_error($ch);
            var_dump($ch);
        }   
        curl_close($ch);
        echo var_dump(json_decode($result, true));
    }
}

But i've got NULL as result. If I try to echo all the variable I can see that the form sends them correctly. The error is probably related to how to send these to the webservice. Any idea to solve this? Many thanks

Upvotes: 0

Views: 63

Answers (2)

I believe I see the problem. In PHP text inside of single quotes is sent as is. So you are passing the string $product. To avoid a lot of string delimiter switching, try something like this:

            { "type_param" : "char", 
                "lenght_param" : 3,
                "param" : "'.$product.'"
            },

This will concatenate the value from the variable into the json string you are building. You will want to do this for every variable you use.

TL;DR: Use a . to join strings together.

Upvotes: 0

RiggsFolly
RiggsFolly

Reputation: 94662

$variables are not expanded when inside a single quoted literal, it has to be a double quoted literal.

So for example change like this

 "param" : "' . $product . '"

and so on for all the values

Upvotes: 2

Related Questions