5

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.

Marc B
  • 340,537
  • 37
  • 382
  • 468
Vaibhav Desai
  • 2,006
  • 1
  • 23
  • 27
  • You are sending a query string, but claiming to send JSON. That might be your first problem. – Jason McCreary Feb 10 '15 at 16:06
  • @JasonMcCreary here is the example for the above using curl, https://developer.atlassian.com/jiradev/api-reference/jira-rest-apis can you suggest what should be the post url ? – Vaibhav Desai Feb 10 '15 at 16:27

2 Answers2

6

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.

Jason McCreary
  • 66,624
  • 20
  • 123
  • 167
  • 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','description'=>'adfefsa','issuetype'=>['name'=>'Task']]]; because if i use the second $data, it does not recognize the project field.To me both the representation look correct. Thanks. – Vaibhav Desai Feb 10 '15 at 17:25
  • Good. I'd ask that in a separate question so it's more clear. Welcome to StackOverflow. – Jason McCreary Feb 10 '15 at 19:20
0

Could you have a typo in your code?

$data=array('fields' => array ('project' => array ('key' => 'WOIS',),'summary' => 'ABC','description' => 'ABC','issuetype' => array ('name' => 'Task',),),); 

vs

$data = ['fields' => ['projects'=>['key'=>'WOIS'],'summary'=>'adfsdf','descriptio‌​n'=>'adfefsa','issue‌​type'=>['name'=>'Tas‌​k']]];

the first line says project while the second line says projects

mxl
  • 437
  • 3
  • 7