2013-06-13 32 views
0

我必須構建一個腳本,將我們從合作伙伴公司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響應,這更有意義。我設置登錄信息的方式有問題嗎?

+0

當您發出成功的API請求並附加到此問題時,請複製瀏覽器的請求標頭和服務器的響應標頭。它可能會提供有關正在發生的事情的線索。 – Eugene

+0

完成。我還應該提到,我已經嘗試了保存cookie,但沒有任何區別。 – Christian

+0

您是否在故意使用了不同的捲曲和瀏覽器請求中的主機,還是它是一個錯字? – Eugene

回答

1

我現在覺得自己很蠢,原因有二:

  1. 尤金指出,即我用我的頭錯誤的主機的錯誤。
  2. 然後我花了半天時間弄清楚授權失敗的原因,閱讀有關捲曲功能和所有內容的文檔。現在我發現了這個錯誤:我的密碼包含一個§符號,並且密碼錯誤僅僅是因爲編碼而發送的。我在我的密碼周圍放了一個utf8_decode,現在它就像一個魅力。另一個謎解決了。
相關問題