首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用.NET切换API v8

使用.NET切换API v8
EN

Stack Overflow用户
提问于 2013-11-11 12:08:51
回答 1查看 1.5K关注 0票数 2

我正尝试在.NET C#中使用新的Toggl API (v8)。我的代码基于来自litemedia (http://litemedia.info/connect-to-toggl-api-with-net)的示例,但它最初是为API第1版创建的。

代码语言:javascript
复制
    private const string TogglTasksUrl = "https://www.toggl.com/api/v8/tasks.json";
    private const string TogglAuthUrl = "https://www.toggl.com/api/v8/me"; //sessions.json";

    private const string AuthenticationType = "Basic";
    private const string ApiToken = "user token goes here";
    private const string Password = "api_token";

    public static void Main(string[] args)
    {
        CookieContainer container = new CookieContainer();
        var authRequest = (HttpWebRequest)HttpWebRequest.Create(TogglAuthUrl);

        authRequest.Credentials = CredentialCache.DefaultCredentials;
        authRequest.Method = "POST";
        authRequest.ContentType = "application/x-www-form-urlencoded";
        authRequest.CookieContainer = container;

        string value = ApiToken; //= Convert.ToBase64String(Encoding.Unicode.GetBytes(ApiToken));
        value = string.Format("{1}:{0}", Password, value);
        //value = Convert.ToBase64String(Encoding.Unicode.GetBytes(value));
        authRequest.ContentLength = value.Length;
        using (StreamWriter writer = new StreamWriter(authRequest.GetRequestStream(), Encoding.ASCII))
        {
            writer.Write(value);
        }

        try
        {
            var authResponse = (HttpWebResponse)authRequest.GetResponse();
            using (var reader = new StreamReader(authResponse.GetResponseStream(), Encoding.UTF8))
            {
                string content = reader.ReadToEnd();
            }

            HttpWebRequest tasksRequest = (HttpWebRequest)HttpWebRequest.Create(TogglTasksUrl);
            tasksRequest.CookieContainer = container;

            //var jsonResult = string.Empty;
            var tasksResponse = (HttpWebResponse)tasksRequest.GetResponse();
            MemoryStream ms = new MemoryStream();
            tasksResponse.GetResponseStream().CopyTo(ms);
            //using (var reader = new StreamReader(tasksResponse.GetResponseStream(), Encoding.UTF8))
            //{
            //    jsonResult = reader.ReadToEnd();
            //}

            ms.Seek(0, SeekOrigin.Begin);
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Task));
            var tasks = ser.ReadObject(ms) as List<Task>;
            ms.Close();
            //var tasks = DataContractJsonConvert.DeserializeObject<Task[]>(jsonResult);

            foreach (var task in tasks)
            {
                Console.WriteLine(
                    "{0} - {1}: {2} starting {3:yyyy-MM-dd HH:mm}",
                    task.Project.Name,
                    task.Description,
                    TimeSpan.FromSeconds(task.Duration),
                    task.Start);
            }

        }
        catch (System.Exception ex)
        {

            throw;
        }
    }

下面的行将返回404错误。

代码语言:javascript
复制
                var authResponse = (HttpWebResponse)authRequest.GetResponse();
EN

回答 1

Stack Overflow用户

发布于 2013-12-16 14:15:57

下面是可以工作的代码。由于我最近一直在寻找这个答案,可能还会有其他人像我一样迷失。注意:我使用Encoding.Default.GetBytes()是因为Encoding.Unicode.GetBytes()在我的.NET字符串上没有给出正确的结果。我希望它不依赖于Visual Studio的默认设置。content-type为"application/json“。对不起,我还没有试过POST版本。

代码语言:javascript
复制
        string ApiToken = "user token goes here";
        string url = "https://www.toggl.com/api/v8/me"; 
        string userpass = ApiToken + ":api_token";
        string userpassB64 = Convert.ToBase64String(Encoding.Default.GetBytes(userpass.Trim()));
        string authHeader = "Basic " + userpassB64;

        HttpWebRequest authRequest = (HttpWebRequest)WebRequest.Create(url);
        authRequest.Headers.Add("Authorization", authHeader);
        authRequest.Method = "GET";
        authRequest.ContentType = "application/json";
        //authRequest.Credentials = CredentialCache.DefaultNetworkCredentials;

        try
        {
            var response = (HttpWebResponse)authRequest.GetResponse();
            string result = null;

            using (Stream stream = response.GetResponseStream())
            {
                StreamReader sr = new StreamReader(stream);
                result = sr.ReadToEnd();
                sr.Close();
            }

            if (null != result)
            {
                System.Diagnostics.Debug.WriteLine(result.ToString());
            }
            // Get the headers
            object headers = response.Headers;
        }
        catch (Exception e)
        {
            System.Diagnostics.Debug.WriteLine(e.Message + "\n" + e.ToString());
        }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19898667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档