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コンテンツとして送信される文字列は、シリアル化およびurlencodedされた通常のhtmlフォームであることをサーバーに通知しています。http_build_queryリレーショナル配列を取り、htmlフォームのようにシリアル化します。

于 2012-10-23T05:22:35.813 に答える