从PHP到HTTP处理程序执行HTTP发布

时间:2012-10-23 05:14:24

标签: php http-post httphandler

因此标题是自我描述性的。这是我的PHP代码

function do_post_request($url, $data, $optional_headers = null)
{
    $url = 'http://localhost:1181/WebSite1/PostHandler.ashx';
    $data = array( 'fprm' => 1, 'sprm'=> 2, 'tprm'=>3
                  );

  $params = array('http' => array(
              'method' => 'POST',
              'content' => $data
            ));

 //$params = array('method'=>'POST', 'content'=>$data);
 /* if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }*/
  $ctx = stream_context_create($params);
  //stream_context_set_option()

  //debug($params);
  //die();
  $fp = @fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
  }
  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
  }
  return $response;
}

这是我的处理程序代码:

 public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/plain";
    string responseStr = "Hello World, this reply is from .net";
    string fprm = context.Request["fprm"];
    string sprm = context.Request["sprm"];
    string tprm = context.Request["tprm"];
    context.Response.Write(responseStr + " " + fprm + " " + sprm + " " + tprm);

}

这是我得到的回复:

'Hello World, this reply is from .net   '

即。没有参数值,我读了similar post,我得到的想法是,你可能需要设置不同的上下文类型来传递内容参数。但是看一下php文档,我找不到任何选项http://php.net/manual/en/context.http.php来设置上下文类型

任何帮助都会很棒,谢谢

1 个答案:

答案 0 :(得分:1)

您只是忘记在流上下文中设置content-type标头。将其设置为application/x-www-form-urlencoded

并且您不能将数组作为内容直接传递给流上下文,它必须是urlencoded表单字符串,因此请使用http_build_query

 $params = array('http' => array(
              'method' => 'POST',
              'header'=>'Content-Type: application/x-www-form-urlencoded',
              'content' => http_build_query($data)
            ));

您没有找到如何更改php的流上下文文档中的内容类型的原因是因为它们没有为此提供包装,但它们确实为您提供了添加任何所需HTTP标头的方法。 / p>

这个content-type是必要的,因为否则所请求的服务器端应用程序最终会得到一个它不知道如何处理的字符串,因为你可以通过tetoically发送任何类型的数据。 http请求。 application/x-www-form-urlencoded告诉服务器,作为内容发送的字符串只是序列化和urlencoded的常规html表单。 http_build_query采用关系数组并将其序列化为html格式。