Jason H
Jason H

Reputation: 21

Failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request - PHP Error

SOLUTION: I had malformed my JSON data for the payload body. The "ttl" => 30 was in the incorrect array() method. This probably won't help anyone in the future, moving the ttl key/value pair made this work correctly as seen below.

$data = array( 
    "statement" => array( 
        "actor" => array(
            "mbox" => "mailto:[email protected]"
        ),
    ),
    "ttl" => 30
);

I have checked numerous other StackOverflow questions and cannot find a solution that works. I should note that I am testing this using a local XAMPP server running on port 8080. Not sure if that matters. I have been able to get this working using Postman, but translating it to PHP has been problematic. Am I missing something? I am not all that familiar with PHP, but need this for work.

EDIT: Some more information about what the API is expecting. It's a fairly simple API that requires a JSON body, a Basic Authorization header, and a Content-Type: application/json.

Here is the JSON body I am using in Postman. This is a direct copy/paste from Postman, which is successfully communicating with the API:

{
    "statement": {
        "actor": {
            "mbox": "mailto:[email protected]"
        }
    },
    "ttl": 30
}

Is there a syntax error in my below PHP code for this? Again, I am learning PHP on the fly so I'm unsure if I am properly constructing a JSON payload using the array() method in PHP.

My code below has the $https_user,$https_password, and $url domain changed for obvious security reasons. In my actual PHP code, I have the same credentials and domain used in Postman.

The $randomSessionID serves no real purpose other than an identification number for future requests. Has no affect on the API response failing or succeeding.

<?php
$https_user = 'username';
$https_password = 'password';
$randomSessionID = floor((mt_rand() / mt_getrandmax()) * 10000000);

$url = 'https://www.example.com/session/' . $randomSessionID . '/launch';

$json = json_encode(array( 
    "statement" => array( 
        "actor" => array(
            "mbox" => "mailto:[email protected]"
        ),"ttl" => 30 
    )
));

$options = array(
    'http' => array(
        'method'  => 'POST',
        'header'  => 'Content-Type: application/json\r\n'.
        "Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n",
        'content' => $json
    )
);

$context  = stream_context_create($options);

$result = file_get_contents($url, false, $context);

if ($result === FALSE) { /* Handle error */ }

?>

Upvotes: 0

Views: 2104

Answers (1)

Jason H
Jason H

Reputation: 21

SOLUTION: I had malformed my JSON data for the payload body. The "ttl" => 30 was in the incorrect array() method. This probably won't help anyone in the future, but moving the ttl key/value pair made this work correctly as seen below.

$data = array( 
    "statement" => array( 
        "actor" => array(
            "mbox" => "mailto:[email protected]"
        ),
    ),
    "ttl" => 30
);

Upvotes: 1

Related Questions