2

可能重复:
通过 Rest 服务器登录 Drupal

我一直在使用此代码获取包含发布数据的文件内容,但收到错误

Warning: file_get_contents(http://50.116.19.49/rest/user/login.json): failed to open  
stream: HTTP request failed! HTTP/1.0 406 Not Acceptable: Unsupported request content type 
application/x-www-form-urlencoded in C:\xampp\htdocs\post.php on line 20

我的代码是

<?php

$postdata = http_build_query(
array(
    'var1' => 'myuser',
    'var2' => 'pwd'
)
);

$opts = array('http' =>
array(
    'method'  => 'POST',
    'header'  => 'Content-type: application/x-www-form-urlencoded',
    'content' => $postdata
)
);

$context  = stream_context_create($opts);

$result = file_get_contents('http://50.116.19.49/rest/user/login.json', false,    
$context);

?>

任何人都可以在此提前提供帮助。

4

3 回答 3

2

我们可以使用 curl 代替函数 file_get_contents($request); 这是 curl 的代码:

 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL,$request);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_TIMEOUT, 15);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

 $xml_response = curl_exec($ch);

其中 $request 是您的网址。

于 2012-10-23T04:53:20.327 回答
1

看起来,这个特定的服务器希望在您调用时在 POST 数据中看到 JSON /login.json,因此您应该在代码中重写一些内容。

  1. 改变$postdata结构:

    $postdata = json_encode(array(
        'var1' => 'myuser',
        'var2' => 'pwd'
    ));
    
  2. 更改Content-Type标题:

    $opts = array('http' => array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/json',
        'content' => $postdata
    ));
    
于 2012-10-23T09:34:58.043 回答
1

file_get_contentsHTTP 流包装器也会返回FALSE错误。错误表示 HTTP 响应的任何错误情况,例如 400 范围内的 HTTP 状态代码,如406 Not Acceptable: Unsupported request content type in your case。

您可以通过将HTTP 上下文选项设置为来禁用“错误时为 FALSE”行为:ignore_errorsTRUE

'ignore_errors' = TRUE,

然后,您也会在错误情况下获得请求的响应正文作为结果。

要获取状态代码本身,您可以使用特殊$http_response_header变量

有关这些设置以及如何解析响应标头的讨论,请参阅HEAD first with PHP Streams。但是,在您的情况下,响应正文可能已经包含有关该问题的更多信息。

在您的具体问题中,您需要仔细检查服务器是否支持请求的编码。由于我不知道你的服务器,我不能说太多。对错误代码的引用可能会为您提供一些启示。您正在使用的Content-type: application/x-www-form-urlencoded似乎有问题。

例如,正如该站点上的其他聪明人告诉我的那样,该端点是 Drupal。如果是这样,在类似的问题中提出了以下建议:

您必须启用application/x-www-form-urlencoded服务端点的内容类型。

执行以下操作:服务->编辑资源->选择选项卡“服务器”->启用“应用程序/x-www-form-urlencoded”,就是这样。

希望这对您有所帮助。

于 2012-10-23T08:51:35.373 回答