Индекс (на основе нуля) должен быть больше или… Работа с Bit.ly API

#api #c#-4.0 #bit.ly

#API #c #-4.0 #bit.ly

Вопрос:

Я работаю (на самом деле больше похоже на игру) с Bit.ly API, и продолжаю получать ошибку в названии этого вопроса. Итак, я собираюсь показать вам код и, надеюсь, кто-нибудь сможет помочь мне решить эту проблему. Сначала код на стороне клиента.

 var x = service.GetClicks(url, service.BitlyLogin, service.BitlyAPIKey);
Console.WriteLine(x);

Console.ReadLine();
  

И это вызываемый код

 public List<int> GetClicks(string url, string login, string key)
{
    List<int> clicks = new List<int>();
    url = Uri.EscapeUriString(url);
    string reqUri =
        String.Format("http://api.bit.ly/v3/clicks?"  
        "login={0}amp;apiKey={1}amp;shortUrl={2}amp;format=xml"  
        login, key, url);

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(reqUri);
    req.Timeout = 10000; // 10 seconds

    Stream stm = req.GetResponse().GetResponseStream();


    XmlDocument doc = new XmlDocument();
    doc.Load(stm);

    // error checking for xml
    if (doc["response"]["status_code"].InnerText != "200")
        throw new WebException(doc["response"]["status_txt"].InnerText);

    XmlElement el = doc["response"]["data"]["clicks"];
    clicks.Add(int.Parse(el["global_clicks"].InnerText));
    clicks.Add(int.Parse(el["user_clicks"].InnerText));

    return clicks;
}
  

Как вы можете видеть, это очень простой код, ничего сложного, и я не вижу ничего, что вызывает эту ошибку. Любой, кто работал с (полная ошибка — индекс (на основе нуля) должен быть больше или равен нулю и меньше размера списка аргументов.) the Bit.ly А API может протянуть руку помощи?

Комментарии:

1. Можете ли вы опубликовать полную трассировку стека?

Ответ №1:

Вместо этого это

 string reqUri =
        String.Format("http://api.bit.ly/v3/clicks?"  
        "login={0}amp;apiKey={1}amp;shortUrl={2}amp;format=xml"   login, key, url);
  

Используйте это

 string reqUri = String.Format("http://api.bit.ly/v3/clicks?login={0}amp;apiKey={1}amp;shortUrl={2}amp;format=xml", login, key, url);
  

Обратите внимание, что я только что заменил знак плюса запятой перед «login, key, url);» в конце строки.Format().

Ответ №2:

Я сузил поиск до места, где я использовал string .Формат для построения массива и содержит меньше в строке.Формат, отличный от того, что предполагалось. Я перевел его в индекс 3, но заполнил только индекс 2

Комментарии:

1. Мне удалось использовать это другим способом. Если вышеуказанное для вас не работает, убедитесь, что вы не написали что-то вроде foo.AppendFormat("{1}", baa); вместо foo.AppendFormat("{0}", baa); — обратите внимание на индекс.

Ответ №3:

Не для вашего конкретного случая, но я столкнулся с этим: убедитесь, что, если у вас есть несколько параметров, вы отправляете их в виде массива объектов вместо IEnumerable:

 IEnumerable<object> myArgs = ...;
string toFormat = "{0} xyz {1}";

String.Format(toFormat, myArgs);
// ERROR, since myArgs is one argument whereas the string template requires two

String.Format(toFormat, myArgs.ToArray());
// Valid, as the Format() accepts an array of objects to fill all arguments in the string