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.