摘要:參見請求分析推測可能是對方服務器不接受這樣的吧或者對的不兼容
1、服務端進行http-post的三種方法 1.1 通過curl函數服務端常見的post提交有三種方式,這里主要記錄curl方式
function post($url, $post_data = "", $timeout = 5){//curl $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_POST, 1); if($post_data != ""){ curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); } curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_HEADER, false); $file_contents = curl_exec($ch); curl_close($ch); return $file_contents; }1.2 通過Filesystem函數
function post2($url, $data) { $postdata = http_build_query( $data ); $opts = array( "http" => array( "method" => "POST", "header" => "Content-type: application/x-www-form-urlencoded", "content" => $postdata ), ); $context = stream_context_create($opts); $result = file_get_contents($url, false, $context); return $result; }1.3 借助網絡函數
fsockopen(); fwrite(); fread(); fclose();
以上三種方法源碼參考自:原文
2、我本地構造的curl成功提交post 2.1 curl提交post源碼/** * [sendPostHttp] * @param string $url 提交地址,[schema://host:port] * @param array $params 需要通過post提交的數據 * @param integer $timeout 連接超時 * @return mixed 提交狀態 */ static public function sendPostHttp($url, $params, $timeout = 5) { // 構造post提交 $ch = curl_init(); $option = array( CURLOPT_URL => $url, CURLOPT_CONNECTTIMEOUT => $timeout, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_HEADER => false, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($params), CURLOPT_RETURNTRANSFER => true, ); curl_setopt_array($ch, $option); // 提交post $ret = curl_exec($ch); if (false == $ret) { echo curl_error($ch); } curl_close($ch); return $ret; }2.2 構造請求中遇到的坑
1、構造過程中參考了php手冊中的curl_setopt
所以首次嘗試時,CURLOPT_POSTFIELDS的值用了數組:
CURLOPT_POSTFIELDS => $params
結果總是返回錯誤信息:
Recv failure: Connection was reset
2、為什么會出現這樣的錯誤呢?
我們注意到CURLOPT_POSTFIELDS說明中如果value是數組,
Content-Type頭將會被設置成multipart/form-data
猜測原因就出在CURLOPT_POSTFIELDS的值上邊,所以將其傳值改為CURLOPT_POSTFIELDS => http_build_query($params),果然success!
參考:http_build_query構造請求字符串
但是,為什么CURLOPT_POSTFIELDS會產生這樣影響呢?查了一下multipart/form-data,但是沒有得到具體原因。參見multipart/form-data請求分析
推測可能是對方服務器不接受這樣的Content-Type吧?
或者對multipart/form-data的不兼容?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21927.html
摘要:規范把請求分為三個部分狀態行請求頭消息主體。消息主體最后以標示結束。格式支持比鍵值對復雜得多的結構化數據,這一點也很有用。例如下面這段代碼最終發送的請求是這種方案,可以方便的提交復雜的結構化數據,特別適合的接口。 Content-Type HTTP 協議是以 ASCII 碼傳輸,建立在 TCP/IP 協議之上的應用層規范。規范把 HTTP 請求分為三個部分:狀態行、請求頭、消息主體。類...
摘要:格式支持比鍵值對復雜得多的結構化數據,這一點也很有用。例如下面這段代碼最終發送的請求是這種方案,可以方便的提交復雜的結構化數據,特別適合的接口。 簡介 form的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,默認為application/x-www-form-urlencoded。 ...
摘要:注意事項以下版本要設置默認編碼,,否則程序可能無法正確顯示中文。組成部分協議是對請求和響應的報文內容進行了約束和規范。請求報文請求是由客戶端發起,其規范格式為請求行請求頭請求主體。 showImg(https://segmentfault.com/img/remote/1460000013696283?w=1920&h=1080); Ajax 前言 前面我們已經學習了js基礎知識和一些...
閱讀 1354·2023-04-25 23:42
閱讀 2845·2021-11-19 09:40
閱讀 3529·2021-10-19 11:44
閱讀 3564·2021-10-14 09:42
閱讀 1873·2021-10-13 09:39
閱讀 3840·2021-09-22 15:43
閱讀 674·2019-08-30 15:54
閱讀 1457·2019-08-26 13:32