我必須構建一個腳本,將我們從合作伙伴公司API獲得的JSON轉換爲我們當前軟件無需太多讀取的Xml文件改變。聽起來很簡單,API也相對簡單 - 只是當我調用它時,我似乎無法得到結果,即使在瀏覽器中使用完全相同的調用。API調用在瀏覽器中可用,但是當通過PHP調用時重定向報告(不正確?)curl
當我在瀏覽器中調用一個API函數時,我得到一個很好的小JSON對象作爲回報,但是當我嘗試在我的PHP腳本中通過curl調用完全相同的URL時,我只獲得了302 - Moved響應。奇怪的是,根據我的看法,重定向不會在瀏覽器中發生,如果我遵循它,它也不包含任何內容(但它確實屬於其他公司)。
我開始懷疑它與授權有關。雖然我已經檢查並重新檢查了大約一百萬次的用戶名和密碼,但我注意到,如果我故意使用錯誤的用戶名/密碼組合,我會得到相同的結果。另外幾件事情我已經注意到:
- IE 9受理登錄就好
- 火狐經常詢問密碼兩次或三次就接受它,並顯示我的JSON結果
- 歌劇院以及前因爲Chrome根本不會接受登錄。這絕對不是輸入錯誤 - 我複製&正在粘貼工作密碼。
現在,我試圖與另一家公司的技術人員進行交流,以便與他人交談,但我開始認爲這可能是一個更普遍的問題,其他人可能遇到好吧,所以我決定在這裏發佈這個問題。以下是我的腳本的摘錄。我現在幾乎可以肯定,我正在做一些愚蠢的事情(或者愚蠢地不做我應該做的事情),如果我能夠在互聯網上匿名地拒絕自己,而不是讓現實生活中的技術人員自己尷尬,那將會很好。
編輯:改變我的腳本中的主機。
function curl_download($url, $username, $password) { $http_headers = array( 'Host: www.myapidomain.com', 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2', 'Accept: */*', 'Accept-Language: en-us,en;q=0.5', 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Connection: keep-alive' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, $http_headers); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); Tried with and without that curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); $output = curl_exec($ch); curl_close($ch); return $output; } $username = '#username'; $password = '#password'; $url = $api_details.$myID; //something like example.com/api/?id=1234 //tried it with a context and file_get_contents once just for the kicks, but didn't work either // $context = stream_context_create(array( // 'http' => array( // 'header' => "Authorization: Basic " . base64_encode("$username:$password") //) //)); // $result = file_get_contents($url, false, $context); $result = curl_download($url, $username, $password); echo 'JSON: '.$result; //result is "302 Found - document has moved here". Following this gives absolutely no output in the browser or when following with curl.
編輯: 好,這裏是請求頭:
(Request-Zeile) GET /api/?id=100100 HTTP/1.1 Host www.myapidomain.com User-Agent Mozilla/5.0 (Windows NT 6.0; rv:21.0) Gecko/20100101 Firefox/21.0 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding gzip, deflate DNT 1 Cookie MaD-Stats=42d1e7eb3c1dbcc59dd28e986ba9ceb3; 5991e5c00fce8acb72465bbca79260ecb=bc800030fa14aff2c5f726f1cfe3ffe7 Authorization Basic fzBob66lajgybiRqYTglbGE5p2FtdTqmQmCmYZk= Connection keep-alive Cache-Control max-age=0
而且這裏的響應頭:
(Status-Zeile) HTTP/1.1 200 OK Date Thu, 13 Jun 2013 10:01:13 GMT Server Apache/2.2.23 (FreeBSD) PHP/5.2.17 mod_ssl/2.2.23 OpenSSL/1.0.1c X-Powered-By PHP/5.2.17 Set-Cookie MaD-Stats=76d1a7eb2c1dbacfcdd2e5986b39ceb3; expires=Mon, 16-Dec-2013 10:01:14 GMT; path=/ Content-Length 602 Keep-Alive timeout=5, max=100 Connection Keep-Alive Content-Type text/html
EDIT2: 因此,響應尤金的問題,我在我的捲髮請求中設置了正確的主持人。現在我得到一個401響應,這更有意義。我設置登錄信息的方式有問題嗎?
當您發出成功的API請求並附加到此問題時,請複製瀏覽器的請求標頭和服務器的響應標頭。它可能會提供有關正在發生的事情的線索。 – Eugene
完成。我還應該提到,我已經嘗試了保存cookie,但沒有任何區別。 – Christian
您是否在故意使用了不同的捲曲和瀏覽器請求中的主機,還是它是一個錯字? – Eugene