2017-06-21 16 views
0

我想用C#克隆/下載我的專用bitbucket.org存儲庫,但我想要使用純HTTPS REST調用,而不是第三方庫,我想了解它是如何工作的。如何使用純REST API調用版本1或2下載專用bitbucket.org存儲庫

到目前爲止,我只能找到api版本1的示例代碼。 這是我有工作迄今在C#是什麼:

static void AUthenticate() 
    { 
     var time = GenerateTimeStamp(); 
     var url = "https://bitbucket.org/api/1.0/oauth/request_token"; 
     var secret = "SECRET"; 
     var key = "KEY"; 

     var sigBaseStringParams = ""; 
     sigBaseStringParams += "oauth_callback=http%3A%2F%2Flocal%3Fdump"; 
     sigBaseStringParams += "&" + "oauth_consumer_key=" + key; 
     sigBaseStringParams += "&" + "oauth_nonce=" + GetNonce(); 
     sigBaseStringParams += "&" + "oauth_signature_method=" + "HMAC-SHA1"; 
     sigBaseStringParams += "&" + "oauth_timestamp=" + time; 
     sigBaseStringParams += "&" + "oauth_version=1.0"; 
     var sigBaseString = "POST&"; 
     sigBaseString += Uri.EscapeDataString(url) + "&" + Uri.EscapeDataString(sigBaseStringParams); 

     var signature = GetSignature(sigBaseString, secret); 

     var res = PostData(url, sigBaseStringParams + "&oauth_signature=" + Uri.EscapeDataString(signature)); 

     var items = GetParameters(res); 

     var tokenSecret = items["oauth_token_secret"]; 
     var token = items["oauth_token"]; 
     var callbackConfirmed = items["oauth_callback_confirmed"]; 

     url = "https://bitbucket.org/api/1.0/oauth/authenticate?oauth_token=" + token; 
    } 

這驗證,我得到3個值回。最後我的網址粘貼到瀏覽器中,在那裏我承認我的應用程序訪問和我結束了一個oauth_verifier

注:我真的不希望這樣做,因爲我寫它贏得了一個服務器程序「T真的能夠(在同一時間,但有一件事)用戶發送到瀏覽器鏈接

我然後運行下面的代碼:

var url = "https://bitbucket.org/api/1.0/oauth/access_token"; 

     var token = "TOKEN FROM PREV CALL"; 
     var time = GenerateTimeStamp(); 
     var sigBaseStringParams = ""; 
     //sigBaseStringParams += "oauth_callback=http%3A%2F%2Flocal%3Fdump"; 

     var secret = "SECRET"; 
     var key = "KEY"; 

     sigBaseStringParams += "oauth_consumer_key=" + key; 
     sigBaseStringParams += "&" + "oauth_token=" + token; 
     sigBaseStringParams += "&" + "oauth_nonce=" + GetNonce(); 
     sigBaseStringParams += "&" + "oauth_signature_method=" + "HMAC-SHA1"; 
     sigBaseStringParams += "&" + "oauth_timestamp=" + time; 
     sigBaseStringParams += "&" + "oauth_verifier=AUTH VERIFIER FROM PREV CALL"; 
     var sigBaseString = "POST&"; 
     sigBaseString += Uri.EscapeDataString(url) + "&" + Uri.EscapeDataString(sigBaseStringParams); 

     var tokenSecret = "TOKEN SECRET FROM PREVIOUS CALL"; 
     var signature = GetSignature(sigBaseString, secret, tokenSecret); 

     var res = PostData(url, sigBaseStringParams + "&oauth_signature=" + Uri.EscapeDataString(signature)); 

這給了我一個400錯誤的請求。我看不到其他的東西。

我下面這個頁面上的步驟:https://confluence.atlassian.com/bitbucket/oauth-on-bitbucket-cloud-238027431.html#OAuthonBitbucketCloud-Refreshtokens

爲什麼我這樣做是因爲我想最終使一個POST請求(或GET)這個網址:

var url2 = "https://bitbucket.org/ACCOUNT/REPOSITORY/get/tip.zip?access_token="+token; 

因爲我認爲這會給我一個zip文件中的整個存儲庫。如果我把它放在瀏覽器中,它會工作,因爲我登錄到bitbucket。

如果有更新/更容易/更好的方式,我願意接受建議。

在此先感謝

+0

你可以暫時使用第三方工具,看看它做什麼使用招或看源的第三方或者與實際的源代碼或dotPeek如果它不會被混淆。 – TyCobb

+0

這是一種方式,但他們是如何弄清楚的? 當然,文檔應該是可用的,因爲它是一個公共API。 我敢肯定,我只是在錯誤的地方尋找或錯過了一些東西。 – Quintonn

回答

1

我發現了一個非常簡單的解決方案。 我不得不提供憑據GET請求:

public static void Downloadfiles(string username, string password, string account, string repository, string pathToSave) 
    { 
     var creds = Base64Encode(String.Format("{0}:{1}", username, password)); 

     var url = String.Format("https://bitbucket.org/{0}/{1}/get/tip.zip", account, repository); 

     using (var client = new WebClient()) 
     { 

      client.Headers.Add("Authorization", "Basic " + creds); 
      client.Headers.Add("Content-Type", "application/octet-stream"); 
      client.DownloadFile(url, pathToSave); 
     } 
    } 
相關問題