HTTP 请求失败! HTTP/1.1 400 错误请求

Posted

技术标签:

【中文标题】HTTP 请求失败! HTTP/1.1 400 错误请求【英文标题】:HTTP request failed! HTTP/1.1 400 Bad Request 【发布时间】:2015-04-10 18:02:47 【问题描述】:

我正在尝试在 Jira 中创建问题。

我能够发出正确响应的 GET 请求,但是当我发出 POST 请求时出现问题。这是代码。

<?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;

?>

我收到以下错误:

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

谁能帮帮我?谢谢

附言

我不想使用 curl 作为 http-streams 的替代品,因为谷歌应用引擎不支持 curl。

【问题讨论】:

您正在发送查询字符串,但声称要发送 JSON。这可能是您的第一个问题。 @JasonMcCreary 这里是上面使用 curl 的示例,developer.atlassian.com/jiradev/api-reference/jira-rest-apis 你能建议帖子网址应该是什么吗? 【参考方案1】:

http_build_query() 生成一个 url 编码的字符串。但是,API 需要 JSON。你应该改用json_encode()

变化:

$data = http_build_query($data);

收件人:

$data = json_encode($data);

虽然可能不是您唯一的问题,但这绝对是一个会导致 400 错误请求的问题。

【讨论】:

谢谢 Jason,你是对的,使用 json_encode() 解决了这个问题。我还有一个小问题,有什么区别 b/w $data=array('fields' => array ('project' => array ('key' => 'WOIS',),'summary' => ' ABC','description' => 'ABC','issuetype' => 数组 ('name' => 'Task',),),);和 $data = ['fields' => ['projects'=>['key'=>'WOIS'],'summary'=>'adfsdf','description'=>'adfefsa','issuetype'=> ['名称'=>'任务']]];因为如果我使用第二个 $data,它无法识别项目字段。对我来说,两种表示看起来都是正确的。谢谢。 好。我会在一个单独的问题中问这个问题,这样会更清楚。欢迎使用 ***。【参考方案2】:

你的代码有错字吗?

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

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

第一行写着project,而第二行写着projects

【讨论】:

这个问题已经有一个公认的答案,问题不是错字...

以上是关于HTTP 请求失败! HTTP/1.1 400 错误请求的主要内容,如果未能解决你的问题,请参考以下文章

telnet HTTP/1.1 400 错误请求的问题

逻辑错误的 HTTP 400(错误请求),不是格式错误的请求语法

HTTP 请求失败! HTTP/1.1 505 HTTP 版本不支持错误

Jetty 在格式错误的 HTTP POST 标头上返回“HTTP/1.1 400 Bad Request”。这是预期的吗?

Telegram + PHP (Windows 7):无法打开流:HTTP 请求失败! HTTP/1.1 404 未找到

file_get_contents - 无法打开流:HTTP 请求失败! HTTP/1.1 404 未找到