$opts = array( 'http'=>array( 'method'=>$_SERVER['REQUEST_METHOD'],
'header'=>array("Accept-language: en\r\n" ,"Cookie: ".session_name()."=".session_id()."\r\n"," Content-type: application/x-www-form-urlencoded\r\n"),
'content' => $_POST) );
$postdata = http_build_query($_POST);
$context = stream_context_create($opts);
session_write_close(); // this is the key
echo $obsah = file_get_contents("http://localhost/journal/", false, $context);
此代码无法使用post和cookie
答案 0 :(得分:12)
现有的两个答案不正确。
不需要将新行(\n
)添加到stream_context_create()
中使用的HTTP标头中,而且不应在HTTP附近的任何地方使用回车符(\r
)。
以下代码从OP中复制并更正:
$postdata = http_build_query($_POST, '', '&', PHP_QUERY_RFC3986);
$opts = array(
'http' => array(
'method' => $_SERVER['REQUEST_METHOD'],
'header' => array(
"Accept-language: en",
"Cookie: " . session_name() . "=" . session_id(),
"Content-type: application/x-www-form-urlencoded",
),
'content' => $postdata,
)
);
$context = stream_context_create($opts);
$obsah = file_get_contents("http://localhost/journal/", false, $context);
echo $obsah
我还在最后一个数组项中添加了逗号,以便维护在Git / SVN提交中不会有不必要的行,并配置http_build_query()以使用更现代的RFC 3986编码。
答案 1 :(得分:0)
在使用array()
而不是字符串传递标题时,您不需要\r\n
,因为PHP的stream_context_create()
会在报头中。
您也不需要session_write_close()
。
答案 2 :(得分:-1)
当你传递多个标题时,在发送POST数据之前应该有两个\r\n
。
让我解释一下。
试试这个:
$opts = array(
'http' => array(
'method' => $_SERVER['REQUEST_METHOD'],
'header' => array(
"Accept-language: en\r\n",
"Cookie: ".session_name()."=".session_id()."\r\n",
"Content-type: application/x-www-form-urlencoded\r\n\r\n"
),
'content' => $_POST
)
);
$postdata = http_build_query($_POST);
$context = stream_context_create($opts);
session_write_close(); // this is the key
echo $obsah = file_get_contents("http://localhost/journal/", false, $context);