API Harvest (приложение таймкарты) - PullRequest
3 голосов
/ 28 апреля 2011

Урожай - это приложение для отслеживания времени, которое я использую на своей работе. Хотя веб-интерфейс довольно прост, есть несколько пользовательских функций, которые я хотел бы добавить. Я заметил, что у них есть API ... Поэтому я хочу сделать для него собственный клиент для настольного компьютера на C #.

Просто глядя на страницу, это не очень информативно. Пример C #, который вы можете найти (после некоторого копания), тоже мало поможет. Итак ... Как в мире я могу использовать API с C #?

Ссылка на страницу API

Любая помощь будет принята с благодарностью:)

Ответы [ 2 ]

7 голосов
/ 28 апреля 2011

Harvest использует REST API , поэтому вы делаете запрос get / put / post на веб-адрес сервера, и он возвращает результат (обычно отформатированный в XML или JSON (в данном случае это XML)). Быстрый поиск в Google вернул это руководство о том, как использовать REST API, надеюсь, этого будет достаточно для того, что вам нужно. Если нет, не стесняйтесь спрашивать нас о конкретных проблемах, возникающих при использовании REST и C #

Здесь я попытаюсь добавить еще несколько комментариев к их образцу

using System;
using System.Net;
using System.IO;
using System.Text;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;

class HarvestSample
{
   //This is used to validate the certificate the server gives you, it allays assumes the cert is valid.
   public static bool Validator (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) {
     return true;
   }

   static void Main(string[] args)
   {
      //setting up the initial request.
      HttpWebRequest request;
      HttpWebResponse response = null;
      StreamReader reader;
      StringBuilder sbSource;
      // 1. Set some variables specific to your account.
      //This is the URL that you will be doing your REST call against. think of it as a function in normal library.
      string uri = "https://yoursubdomain.harvestapp.com/projects";
      string username="youremail@somewhere.com";
      string password="yourharvestpassword";
      string usernamePassword = username + ":" + password;

      //This checks the SSL cert that the server will give us, the function is above this one.
      ServicePointManager.ServerCertificateValidationCallback = Validator;

      try
      {
         //more setup of the connection
         request = WebRequest.Create(uri) as HttpWebRequest;
         request.MaximumAutomaticRedirections = 1;
         request.AllowAutoRedirect = true;

         // 2. It's important that both the Accept and ContentType headers are
         // set in order for this to be interpreted as an API request.
         request.Accept = "application/xml";
         request.ContentType = "application/xml";
         request.UserAgent = "harvest_api_sample.cs";
         // 3. Add the Basic Authentication header with username/password string.
         request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));
         //actually perform the GET request
         using (response = request.GetResponse() as HttpWebResponse)
         {
            //Parse out the XML it returned.
            if (request.HaveResponse == true && response != null)
            {
               reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
               sbSource = new StringBuilder(reader.ReadToEnd());
               // 4. Print out the XML of all projects for this account.
               Console.WriteLine(sbSource.ToString());
            }
         }
      }
      catch (WebException wex)
      {
         if (wex.Response != null)
         {
            using (HttpWebResponse errorResponse = (HttpWebResponse)wex.Response)
            {
               Console.WriteLine(
                     "The server returned '{0}' with the status code {1} ({2:d}).",
                     errorResponse.StatusDescription, errorResponse.StatusCode,
                     errorResponse.StatusCode);
            }
         } else {
               Console.WriteLine( wex);

}
      } finally {
         if (response != null) { response.Close(); }
      }
   }
}
2 голосов
/ 02 июля 2012

Я также боролся с их API. Ответ Скотта очень полезен.

В любом случае есть очень полезная и простая библиотека, которая называется EasyHttp, которую вы можете найти в NuGet . здесь тот же метод, что и у Скотта, но гораздо короче:):

public static string getProjects()
    {

        string uri = "https://<companyname>.harvestapp.com/projects";
        HttpClient http = new HttpClient();
        //Http Header
        http.Request.Accept = HttpContentTypes.ApplicationJson;
        http.Request.ContentType = HttpContentTypes.ApplicationJson;
        http.Request.SetBasicAuthentication(username, password);
        http.Request.ForceBasicAuth = true;
        HttpResponse response = http.Get(uri);

        return response.RawText;        
    }

Если вы хотите узнать больше о вызовах WebApi, вы можете использовать Fidler или более простой и RestClient , который является плагином Firefox.

С RestClient вы можете напрямую общаться с остальными серверами, что очень полезно, если вы хотите понять службы RESTful.

...