2014-01-21 57 views
10

我正在撞牆,試圖將正在工作的curl命令轉換爲c#WebRequest。相當於CURL命令的WebRequest

我已經閱讀了不少帖子,我很確定我的代碼是正確的,但它仍然無法正常工作。

任何人都可以看到我做錯了,請嗎?

這裏是工作curl命令:

curl -k -u x:reallylongstring -H "Content-Type: application/json" https://api.somewhere.com/desk/external_api/v1/customers.json 

這是我寫在C#代碼:

WebRequest wrGETURL; 
wrGETURL = WebRequest.Create("https://api.somewhere.com/desk/external_api/v1/customers.json"); 
wrGETURL.Method = "GET"; 
wrGETURL.ContentType = "application/json"; 
wrGETURL.Credentials = new NetworkCredential("x", "reallylongstring"); 
Stream objStream = wrGETURL.GetResponse().GetResponseStream(); 
StreamReader objReader = new StreamReader(objStream); 
string responseFromServer = objReader.ReadToEnd(); 

但是API響應:

The remote server returned an error: (406) Not Acceptable. 

任何幫助將不勝感激!

感謝

+0

這是一個重複[.NET - 讓C#中的捲曲電話](http://stackoverflow.com/questions/7929013/making-a-curl-call-in- C-尖銳)?那裏似乎有更多的答案。 – user34660

回答

7

基於尼可拉斯指針我看起來與下面的代碼有固定的這個:

public static gta_allCustomersResponse gta_AllCustomers() 
    { 
     var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.somewhere.com/desk/external_api/v1/customers.json"); 
     httpWebRequest.ContentType = "application/json"; 
     httpWebRequest.Accept = "*/*"; 
     httpWebRequest.Method = "GET"; 
     httpWebRequest.Headers.Add("Authorization", "Basic reallylongstring"); 

     var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 

     using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
     { 
      gta_allCustomersResponse answer = JsonConvert.DeserializeObject<gta_allCustomersResponse>(streamReader.ReadToEnd()); 
      return answer; 
     } 
    } 
0

根據關於406這個問題:What is "406-Not Acceptable Response" in HTTP?或許你可以嘗試添加接受頭你的要求?也許curl會自動添加。

另外你的curl請求中有一個-k,告訴它忽略SSL驗證,我不確定它是否會影響.NET代碼。換句話說,沒有'-k'捲曲仍然工作嗎?那麼,別擔心。否則,也許你需要告訴.NET也忽略SSL驗證。

+0

我想你可能會在那裏...... curl不工作沒有-k,而且我可以在電話中看到Accept:*/*,當我在小提琴手中看它時 –

2

這裏是我的解決方案,以JSON數據發佈到使用API​​調用或web服務

public static void PostJsonDataToApi(string jsonData) 
    { 

     var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.somewhere.com/v2/cases"); 
     httpWebRequest.ReadWriteTimeout = 100000; //this can cause issues which is why we are manually setting this 
     httpWebRequest.ContentType = "application/json"; 
     httpWebRequest.Accept = "*/*"; 
     httpWebRequest.Method = "POST"; 
     httpWebRequest.Headers.Add("Authorization", "Basic ThisShouldbeBase64String"); // "Basic 4dfsdfsfs4sf5ssfsdfs==" 
     using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
     { 
      // we want to remove new line characters otherwise it will return an error 
      jsonData= thePostBody.Replace("\n", ""); 
      jsonData= thePostBody.Replace("\r", ""); 
      streamWriter.Write(jsonData); 
      streamWriter.Flush(); 
      streamWriter.Close(); 
     } 

     try 
     { 
      HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse(); 
      string respStr = new StreamReader(resp.GetResponseStream()).ReadToEnd(); 
      Console.WriteLine("Response : " + respStr); // if you want see the output 
     } 
     catch(Exception ex) 
     { 
     //process exception here 
     } 

    } 
3

這是我用來發布json數據的curl命令:

curl http://IP:PORT/my/path/to/endpoint -H 'Content-type:application/json' -d '[{...json data...}]' 

這相當於上面的cu用C#RL命令:

var url = "http://IP:PORT/my/path/to/endpoint"; 
var jsonData = "[{...json data...}]"; 

using (var client = new WebClient()) 
{ 
    client.Headers.Add("content-type", "application/json"); 
    var response = client.UploadString(url, jsonData); 
}