PHP復用curl請求遇到的請求引數混亂的問題

2021-07-12 04:40:03 字數 1733 閱讀 1216

在調開放平台的乙個查詢介面的時候,開始一直是好好的,某種特定的情況下會報簽名失敗!不能理解,介面一直執行的好好的,沒有改動,一定是**出現了問題!

經過若干次嘗試,終於復現問題。找到了這個「特定情況」。如果我在請求這個查詢介面,稱之為a介面吧,請求a介面之前,請求了同一網域名稱下的另外乙個介面b,這時候就會出現「簽名失敗」的問題。百分百復現。

進一步分析框架發現,在進行介面請求時,採用的httprequest 根據網域名稱 復用了curl請求以達到節省每次curl_init的資源開銷的目的:

[php]view plain

copy

public

static

function

get_curl(

$host_id

)   

} else

return

$ch;  

}  

經過嘗試發現,如果不適用curl連線池,上述問題是不會出現的。那麼問題就出在使用了curl連線池造成了某種影響。

既然介面方返回簽名失敗,那就要先看看請求到介面方的引數到底是什麼樣子的。接下來就是把介面方的介面位址換成本地的測試介面位址,經過上述請求過程,赫然發現,請求介面b的引數在請求介面a的時候,一併傳過去了!就是在復用curl請求的時候,連請求引數也一併復用了?!

進一步發現,a介面的請求方式是get,b介面的請求方式是post!如果保持兩個介面的請求方式一致,則不會出現上述問題!

到此為止,事情的脈絡已經基本清晰了。到底什麼原因導致請求引數被復用了呢?還是要從框架找原因。

[php]view plain

copy

private

function

curl_setopt() \""

;  }  

...  

}  

[php]view plain

copy

private

function

load_query_fields()   

foreach

($this

->query_fields 

as$name

=> 

$value

)   if(

$pairs

)  curl_setopt($this

->ch, curlopt_url, 

$this

->url . 

'?'. 

$this

->query_string);  

}  private

function

load_post_fields()   

if(true == 

$this

->has_upload)  

else

foreach

($this

->post_fields 

as$name

=> 

$value

)  else

}  if(!

empty

($pairs

))   

}  

並沒有使用curl_setopt($ch,curlopt_post)來限定此次請求是post還是get,因此,第二次請求時用的get方式,但是由於沒有post引數,上一次請求的 post field不會被覆蓋掉。導致引數被復用的問題。

PHP 傳送cURL請求

desc xmsb curl 傳送curl請求 param string url 請求位址 param array data post請求的引數 param array header 頭部資訊 return string function xmsb curl url,data header 為1時返...

Fiddler 如何抓取PHP的curl請求

本文主要介紹如何使用fiddler工具,來進行抓取php的curl請求,如果你會使用fiddler,那就是一行 的事,不會也沒事,本文會教你如何簡單的使用。設定橋接網路為127.0.0.1 8888 curl setopt ch,curlopt proxy,127.0.0.1 8888 示例 因為是...

PHP使用curl實現put請求

因為接觸少,所以我只知道curl只支援get或者post的請求形式,而且網上搜尋一般也都是介紹這兩種。今天在專案中遇到嘞要使用put形式請求的介面,困惑了好久。終於找到了解決方案,在這裡分享下。首先get請求寫法 ch curl init 請求位址 curl setopt ch,curlopt re...