Echo Nest API: преобразовать команду curl для проверки ограничения скорости в С#

Я пытаюсь преобразовать эту команду curl в С#

curl -i 'http://developer.echonest.com/api/v4/artist/profile?api_key=[API KEY]&name=weezer'

Это возвращает заголовок ответа с таким содержимым:

HTTP/1.1 200 OK
Content-Length: 135
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 62
X-RateLimit-Used: 58

Я попробовал этот код, но когда я его запускаю, он получает исключение: «Метод ошибки 405 HTTP не разрешен».

string baseurl = "http://developer.echonest.com/api/v4/artist/profile?api_key=[API KEY]&name=weezer";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(baseurl);
request.Method = "POST";
request.Accept = "application/json";
request.UserAgent = "curl/7.37.0";
request.ContentType = "application/x-www-form-urlencoded";

using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
    string data = "browser=Win7x64-C1|Chrome32|1024x768&url=http://www.google.com";
    streamWriter.Write(data);
}

var response = request.GetResponse();
string text;

using (var sr = new StreamReader(response.GetResponseStream()))
{
    text = sr.ReadToEnd();
    Console.WriteLine(text);
}

Любая помощь будет оценена.


person carlyrae    schedule 08.02.2016    source источник
comment
Попробуйте изменить Method на GET.   -  person Daniel    schedule 08.02.2016
comment
Я пробовал это, но теперь он получает исключение нарушения протокола.   -  person carlyrae    schedule 08.02.2016
comment
Почему вы используете StreamWriter? HTTP GET обычно не имеет полезной нагрузки. Попробуйте удалить весь блок using.   -  person Daniel    schedule 08.02.2016
comment
Я удалил его. Это работает, но в ответе нет заголовка ответа.   -  person carlyrae    schedule 08.02.2016
comment
Удалите request.ContentType, поскольку вы не отправляете никакой полезной нагрузки. Установить request.Accept = "*/*";   -  person Daniel    schedule 08.02.2016
comment
До сих пор нет заголовка ответа.   -  person carlyrae    schedule 08.02.2016
comment
Я не чувак С#, но разве заголовки не должны быть чем-то вроде response.Headers?   -  person Daniel    schedule 08.02.2016
comment
Получилось сейчас. Спасибо.   -  person carlyrae    schedule 08.02.2016


Ответы (1)


Помимо изменений, предложенных Даниэлем, я бы удалил UserAgent. После этого он выглядит очень похоже на C#, который я успешно использую. Вот несколько сокращенная версия этого:

    string baseurl = "http://developer.echonest.com/api/v4/artist/profile?api_key=[API KEY]&name=weezer";
    var req = (HttpWebRequest) WebRequest.Create(baseurl);
    req.Method = WebRequestMethods.Http.Get;
    req.Accept = "application/json";

    using (var response = (HttpWebResponse) req.GetResponse())
    {
        if (response.StatusCode == HttpStatusCode.OK)
        {
            var stream = response.GetResponseStream();
            if (stream != null)
            {
                using (var sr = new StreamReader(stream))
                {
                    responseString = sr.ReadToEnd();
                }

                var remaining = GetRateInfo(response.Headers, "X-RateLimit-Remaining");
                var used = GetRateInfo(response.Headers, "X-RateLimit-Used");
                var limit = GetRateInfo(response.Headers, "X-RateLimit-Limit");
                Trace.WriteLine($"Excedeed EchoNest Limits: remaining {remaining} - used {used} - limit {limit}");
            }
        }
        else
        {
            // Error handling
        }

// И код разбора заголовка:

    private static int GetRateInfo(WebHeaderCollection headers, string type)
    {
        var s = headers.Get(type);
        if (s == null)
            return -1;

        int info;
        return int.TryParse(s, out info) ? info : -1;
    }
person David W Gray    schedule 09.02.2016