2012-12-10 25 views
0

我正在嘗試使用Asana API來更新數據並將其添加到Asana。我如何在C#中執行此操作?將數據POST到C中的Asana API#

我得到的數據很好 - 下面的示例代碼:

string apiKey = "xxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxx"; 
var req = WebRequest.Create("https://app.asana.com/api/1.0/workspaces/xxxxxxxxxxxxxxx/projects"); 

var authInfo = apiKey + ":"; 
var encodedAuthInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
req.Headers.Add("Authorization", "Basic " + encodedAuthInfo); 
var response = new StreamReader(req.GetResponse().GetResponseStream()).ReadToEnd(); 

但我不知道如何發佈數據。

他們的文檔中的所有示例都使用了我沒有經驗的Python。

我已經聯繫了Asana但還沒有收到回覆。 這是我到目前爲止。我得到一個400錯誤在最後一行

var url = "https://app.asana.com/api/1.0/workspaces/xxxxxxxxxxxxxxxxxxx/tasks"; 
string json = 
    "\"data\": { " + 
    "\"workspace\": nnnnnnnnnnnnnnnn," + 
    "\"name\": \"test\"," + 
    "\"notes\": \"testing API POST\"" + 
    "}";   

byte[] bytes = Encoding.UTF8.GetBytes(json); 
var req = WebRequest.Create(url) as HttpWebRequest; 

req.Method = "POST"; 
req.ContentLength = bytes.Length; 
req.ContentType = "application/json"; 

var requestStream = req.GetRequestStream(); 
requestStream.Write(bytes, 0, bytes.Length); 

var response = req.GetResponse(); //error 
+0

你只需要弄清楚你必須使用哪些uri來獲取/放置一些信息和所需的標題和參數。你可以使用HttpWebRequest/Response來做到這一點。這就是你需要的。 – Vlad

+0

這是所需的標題和參數,我不知道該怎麼做或如何實現。我複製了上面的代碼。 –

回答

0

這是我要做的事:

public string SendRequest(WebRequestModel requestModel) 
{ 
    var request = WebRequest.Create(uri); 
    var encoding = new UTF8Encoding(); 
    var requestData = encoding.GetBytes(requestModel.POSTData); 

    request.ContentType = requestModel.ContentType; 

    request.Method = WebRequestMethods.Http.Post; 
    request.Timeout = (300 * 1000); 
    request.ContentLength = requestData.Length; 
    // add your header value here 
    //request.Headers["myheader"] = ""; 

    using (var stream = request.GetRequestStream()) 
    { 
      stream.Write(requestData, 0, requestData.Length); 
    } 
    response = request.GetResponse(); 

    using (var reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII)) 
    { 
     result = reader.ReadToEnd(); 
    } 
    return result; 
} 

我WebRequestModel看起來是這樣的:

public class WebRequestModel 
{ 
    public string Url { get; set; } 
    public string POSTData { get; set; } 
    public string ContentType { get; set; } 
} 
+0

這是如何將數據發佈到Asana API或者您通常如何將數據發佈到Web服務? –

+0

對不起,並不是要給人以Asana特有的印象。這實際上是我用來將數據發佈到拖船供應商的代碼。 – markpsmith

+0

好吧,我這麼認爲。我從Asana收到400錯誤,但沒有進一步的信息,所以我不確定我做錯了什麼。這就是我所擁有的: –

1

這是我用專門與Asana API進行交互。編碼參數函數獲取鍵值對的列表,並將它們轉換爲「key = value & key = value」形式的字符串。

代碼的發送數據部分不是我的,但我不記得我從哪裏得到它。

我剛開始在C#中開發一個API包裝器,所以這個測試非常輕鬆。它可能不如它強大,但是我知道它確實能夠很好地在Asana中創建一個新的工作區。

private string EncodeParameters(ICollection<KeyValuePair<string, string>> parameters) 
    { 
     string ret = ""; 
     foreach (KeyValuePair<string, string> pair in parameters) 
     { 
      ret += string.Format("{0}={1}&", pair.Key, pair.Value); 
     } 
     ret = ret.TrimEnd('&'); 

     return ret; 
    } 

    public string GetResponse(string uri, ICollection<KeyValuePair<string, string>> parameters, RequestMethods method = RequestMethods.POST) 
    { 
     return GetResponse(uri, EncodeParameters(parameters), method); 
    } 

    public string GetResponse(string uri, string data = "", RequestMethods method = RequestMethods.GET) 
    { 
     System.Diagnostics.Trace.WriteLine(uri); 

     // create request 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
     request.PreAuthenticate = true; 
     request.Method = method.ToString().ToUpper(); 
     request.ContentType = "application/x-www-form-urlencoded"; 

     // log in 
     string authInfo = API_KEY + ":" + ""; // blank password 
     authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
     request.Headers["Authorization"] = "Basic " + authInfo; 

     // send data 
     if (data != "") 
     { 
      byte[] paramBytes = Encoding.ASCII.GetBytes(data); 
      request.ContentLength = paramBytes.Length; 
      Stream reqStream = request.GetRequestStream(); 
      reqStream.Write(paramBytes, 0, paramBytes.Length); 
      reqStream.Close(); 
     } 

     // get response 
     try 
     { 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      return new StreamReader(response.GetResponseStream()).ReadToEnd(); 
     } 
     catch (WebException ex) 
     { 
      HttpWebResponse response = ((HttpWebResponse)ex.Response); 
      throw new Exception(uri + " caused a " + (int)response.StatusCode + " error.\n" + response.StatusDescription); 
     } 
    }