2012-10-23 25 views
0

所以標題是自我描述性的。這裏是我的PHP代碼從PHP到HTTP處理程序做一個HTTP POST

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和我得到的想法是,也許你需要設置不同的上下文類型來傳遞內容參數。但看throught PHP文檔,我不找任何選項,http://php.net/manual/en/context.http.php,用於設置上下文類型

任何幫助將是巨大的,感謝

+0

header(content-type:你的內容類型在這裏); –

回答

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表單。

+0

不是,dint工作:( – shabby

+0

查看更新回答 – Delta

+0

賓果!知道了,謝謝 – shabby