HTTP request failed! HTTP/1.1 400 Bad Request

17,587

http_build_query() generates a url-encoded string. However, the API requires JSON. You should be using json_encode() instead.

Change:

$data = http_build_query($data);

To:

$data = json_encode($data);

While maybe not your only problem, this is definitely one problem that would result in an 400 Bad Request.

Share:
17,587
Vaibhav Desai
Author by

Vaibhav Desai

Love solving problems, building robust systems. Passionate Computer Scientist.

Updated on June 19, 2022

Comments

  • Vaibhav Desai
    Vaibhav Desai about 2 years

    I am trying to create a issue in Jira .

    I am able to make a GET request with a proper response, but the problem arises when i make a POST request.Here is the code.

    <?php
    
    $userName ='xxxxxxxxxxxxxxxx';
    $password ='xxxxxxxxxxxx';
    
    $data = ['fields' => ['projects'=>['key'=>'ABC'],'summary'=>'abc','description'=>'abc','issuetype'=>['name'=>'Task']]];
    
    $data = http_build_query($data);
    $context = 
         array("http"=>
            array(
                "method" => "POST",
                    "header" => "Authorization: Basic " . base64_encode($userName.':'.$password) . "\r\n".
                    'Accept: application/json'."\r\n".
                    "Content-Length: ".strlen($data)."\r\n".
                        'Content-Type: application/json'."\r\n",
                'content' => $data,
                'verify_peer'=>false,
                'verify_peer_name'=>false,
                )
                );
    $context = stream_context_create($context);
    $result = file_get_contents("https://xxxxx.atlassian.net/rest/api/2/issue/", false, $context);
    echo "The result is ", $result;
    

    ?>

    I get the following error:

    Warning:file_get_contents(https://xxxxx.atlassian.net/rest/api/2/issue/):
    failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in
    /var/www/html/test/new.php on line 27
    

    Could any one help me out? Thanks

    P.S

    I dont want to use curl as an alternative to http-streams as google app engine does not support curl.

  • Vaibhav Desai
    Vaibhav Desai over 9 years
    Thanks Jason, you were right, using json_encode() solved the problem. I have one more small question, what is the difference b/w $data=array('fields' => array ('project' => array ('key' => 'WOIS',),'summary' => 'ABC','description' => 'ABC','issuetype' => array ('name' => 'Task',),),); and $data = ['fields' => ['projects'=>['key'=>'WOIS'],'summary'=>'adfsdf','descriptio‌​n'=>'adfefsa','issue‌​type'=>['name'=>'Tas‌​k']]]; because if i use the second $data, it does not recognize the project field.To me both the representation look correct. Thanks.
  • Jason McCreary
    Jason McCreary over 9 years
    Good. I'd ask that in a separate question so it's more clear. Welcome to StackOverflow.
  • ᴄʀᴏᴢᴇᴛ
    ᴄʀᴏᴢᴇᴛ over 6 years
    there is already an accepted answer to this question and the problem was no a typo...