2014-01-21 6 views
10

Я ударяю головой о стену, пытаясь преобразовать рабочую команду curl в C# WebRequest.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(); 

Но апи отвечает:

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

Любая помощь был бы очень признателен!

Благодаря

+0

Является ли это дубликат [.net - Создание локонов вызова в C#] (http://stackoverflow.com/questions/7929013/making-a-curl-call-in- с-диез)? Там, кажется, больше ответов. – 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?, возможно, вы могли бы попробовать добавив Accept заголовок на запрос? Возможно, завиток добавляет это автоматически.

Также есть -k в вашем запросе curl, в котором говорится, что он игнорирует проверку SSL, что я не уверен, влияет ли это на код .NET. Другими словами, работает ли завиток без «-k»? Тогда не беспокойтесь. В противном случае, возможно, вам нужно сказать .NET, чтобы также игнорировать проверку SSL.

+0

Я думаю, что вы можете быть на что-то там ... завиток не работает без -k, а также я могу видеть Accept: */* в вызове, когда я смотрю на него в скрипаче –

2

Вот мое решение размещать данные JSON с помощью вызова API или веб-сервиса

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

Это команда curl, которую я использую для публикации данных json:

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

Это эквивалентно приведенному выше cu Команда ая с C#:

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); 
} 
Смежные вопросы