WebRequest эквивалентен команде CURL
Я ударяю головой о стену, пытаясь преобразовать рабочую команду curl в С# WebRequest.
Я прочитал довольно много сообщений, и я был уверен, что у меня правильный код, но он все равно не сработает.
Может ли кто-нибудь увидеть, что я делаю неправильно?
Вот рабочая команда curl:
curl -k -u x:reallylongstring -H "Content-Type: application/json" https://api.somewhere.com/desk/external_api/v1/customers.json
И это код, который я написал в С#:
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.
Любая помощь будет очень признательна!
Спасибо
Ответы
Ответ 1
На основе указателей Nikolaos я, по-видимому, исправил это следующим кодом:
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;
}
}
Ответ 2
Это команда curl, которую я использую для отправки json-данных:
curl http://IP:PORT/my/path/to/endpoint -H 'Content-type:application/json' -d '[{...json data...}]'
Это эквивалентно приведенной выше команде curl с С#:
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);
}
Ответ 3
Вот мое решение для публикации 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
}
}
Ответ 4
В соответствии с этим вопросом, касающимся 406: Что такое "406-Не приемлемый ответ" в HTTP? возможно, вы могли бы попробовать добавить заголовок Принять в свой запрос? Возможно, завиток добавляет это автоматически.
Также есть -k в вашем запросе curl, в котором говорится, что он игнорирует проверку SSL, и я не уверен, влияет ли это на код .NET. Другими словами, работает ли завиток без "-k"? Тогда не беспокойтесь. В противном случае, возможно, вам нужно сказать .NET, чтобы также игнорировать проверку SSL.