0

所以标题是自我描述的。这是我的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   '

即没有参数值,我读了一个类似的帖子,我得到的想法是,也许你需要设置不同的上下文类型来传递内容参数。但是通过 php 文档查看,我没有找到任何用于设置上下文类型的选项http://php.net/manual/en/context.http.php

任何帮助都会很棒,谢谢

4

1 回答 1

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 标头的方法。

content-type是必要的,因为否则请求的服务器端应用程序最终会得到一个它不知道如何处理的字符串,因为从理论上讲,您可以通过 http 请求的内容发送任何类型的数据。application/x-www-form-urlencoded告诉服务器作为内容发送的字符串只是一个常规的 html 表单序列化和 urlencoded。http_build_query接受一个关系数组并像 html 表单一样对其进行序列化。

于 2012-10-23T05:22:35.813 回答