С# 400 плохой запрос и длинные символы, насколько важны API

using System;
using System.Net;
using System.IO;

namespace MakeAGETRequest_charp
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    public class Class1
    {
         static void Main(string[] args)
       {
           string sURL;


           sURL = "https://secure.logmein.com/public-api/v1/inventory/hardware/reports";

            WebRequest wrGETURL;
            wrGETURL = WebRequest.Create(sURL);
            wrGETURL.UseDefaultCredentials = true;

            wrGETURL.PreAuthenticate = true;
            wrGETURL.Credentials = CredentialCache.DefaultCredentials;
            wrGETURL.ContentType = "application/json";

             //wrGETURL.Headers.Add("Company Id:", "xxxxxxxxx");
           // wrGETURL.Headers.Add("PSK:", "0x_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
            wrGETURL.Headers[HttpRequestHeader.Authorization] = "companyId":"114xxxxxx", "psk":" 0x_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";




            WebProxy myProxy = new WebProxy("myproxy", 80);
            myProxy.BypassProxyOnLocal = true;

           // wrGETURL.Proxy = WebProxy.GetDefaultProxy();  // obsolete not needed

            Stream objStream;
            objStream = wrGETURL.GetResponse().GetResponseStream();

            StreamReader objReader = new StreamReader(objStream);

            string sLine = "";
            int i = 0;

            while (sLine != null)
            {
                i++;
                sLine = objReader.ReadLine();
                if (sLine != null)
                    Console.WriteLine("{0}:{1}", i, sLine);
            }
            Console.ReadLine();
        }
    }
}

Я пытаюсь получить отчет с веб-сайта Logmein и, основываясь на их документации, мне действительно нужна помощь в первую очередь в этой проблеме, чтобы получить инвентаризацию оборудования.... ошибка - 400 неверных запросов и длинных символов.

Как я могу пройти аутентификацию по psk и идентификатору компании?

Рабочий код, который теперь использует RESTAPI и получает аналогичный результат с моим AUTOit SCRIPT, является нулевым токеном и токеном с истекающим сроком действия. Проблема с сервером LOGmein, не выдающий отчет: `using System;

с помощью System.Net; с помощью System.IO; используя System.Net.Http; с помощью RestSharp;

namespace MakeAGETRequest_charp { /// /// Сводное описание для Class1. /// общедоступный класс ConsoleApplication3 {

    static void Main(string[] args)

    {

        var ade = new RestClient("https://secure.logmein.com/");
        var request = new RestRequest("public-api/v1/inventory/system/reports", Method.GET);
  request.AddHeader("authorization", "{\"companyId\":113,\"psk\":\"00_loqxkwbz8w0xxxxxxx\"}");
    request.AddHeader("accept", "application/Json; charset=utf-8");
   IRestResponse response = ade.Execute(request);


        //string sURL;


   var result = "";


       result = response.Content;
       Console.Write(result);
       Console.Read()


   //Console.WriteLine(ade.Execute(request));
           // Console.Read();




        }

    }
} `

person great77    schedule 21.01.2016    source источник
comment
Где страница документации API? Я не мог найти его в Интернете. Только я смог найти это: secure.logmein.com/ws/api /alertEventGetList.aspx?help=1. Вы отправляете их в заголовке, но в приведенной выше ссылке кажется, что значения входят в строку запроса. Вы пробовали это? Кроме того, почему бы вам не использовать Httpclient?   -  person jpgrassi    schedule 21.01.2016
comment
Спасибо jpprassi. У них есть два API. То, что вы написали, мне подходит. Я использую это для инвентаризации оборудования/программного обеспечения. Файл в формате pdf выглядит следующим образом: secure.logmein.com/welcome/documentation/EN /pdf/ . Пожалуйста, дайте мне знать ваши мысли. Я использовал autoit, и мне кажется, что срок действия нулевого токена истекает. Я хочу С#. Я еще не эксперт в С#, но просто хочу знать, может ли это решить мою проблему.   -  person great77    schedule 21.01.2016


Ответы (1)


Поскольку у меня нет параметров для фактического входа в API, я не могу с уверенностью сказать, что это сработает. Но он реализует все требования, указанные в документах, на которые вы сослались

Я делаю этот пример, используя HttpClient, который находится внутри сборки System.Net.Http.

using(var client = new HttpClient())
{
    //Base Url
    client.BaseAddress = new Uri("http://secure.logmein.com/public-api/v1/");

    //Add mandatory Request Headers General parameters Section of doc               
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
    client.DefaultRequestHeaders.Add("Accept", "application/json; charset=utf-8");

    //Authentication header. 
    string auth = "{\"companyId\":123456,\"psk\":\"ABCZSWDED\"}";
    client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization:", auth);

    HttpResponseMessage response = client.GetAsync("inventory/hardware/reports").Result;
}

Единственная проблема заключается в том, что API ожидает заголовок авторизации со значением JSON. Это не метод авторизации "по умолчанию". Из-за этого вам нужно использовать TryAddWithoutValidation, чтобы пропустить проверку и добавить json в заголовок запроса.

Если это все еще не работает, вам, вероятно, потребуется использовать другой http-клиент для выполнения запроса. Я видел людей, использующих RestSharp для успешного входа в этот API. См. аналогичный вопрос

person jpgrassi    schedule 21.01.2016
comment
Спасибо jpgrassi. Выдает ошибку. Как мне включить httpclient, я пытаюсь использовать эту альтернативу, если это поможет. документация по API по этой ссылке secure.logmein.com/ws/api /alertEventGetDetails.aspx?help=1 - person great77; 21.01.2016
comment
Спасибо jpgrassi. Выдает ошибку. Как мне включить httpclient, я пытаюсь использовать эту альтернативу, если это поможет. документация по API по этой ссылке secure.logmein.com/ws/api /alertEventGetDetails.aspx?help=1 . У меня он дает ответ только в порядке, как я могу написать intlist в этой части страницы. код у меня sURL = secure.logmein. com/ws/api/, 3, 10,12 . Я подумал, может быть, есть способ сделать это, и это единственный способ, которым я - person great77; 21.01.2016
comment
Я обновил свой ответ, включив в него ссылку на HttpClient, см. там. Это новый API, о котором вы говорите. Мой ответ был для того, который вы публикуете в своем вопросе (отчеты), который использует совершенно другой процесс аутентификации. Какой из них вы действительно используете? - person jpgrassi; 21.01.2016
comment
Это дает эту ошибку Ошибка 1 Имя типа или пространства имен «Http» не существует в пространстве имен «System.Net» (вам не хватает ссылки на сборку?) Я включил использование System.Net.Http.HttpClient . Я пробую другой API, чтобы увидеть, даст ли это мне лучшее решение. - person great77; 21.01.2016
comment
Вам нужно добавить ссылку на System.Net.Http (извините, я ввел неправильное пространство имен. Сейчас исправлено). Затем добавьте использование в файле .cs для использования System.Net.Http; - person jpgrassi; 21.01.2016
comment
Я использовал System.Net.http в верхней части кода. Как мне добавить ссылку, потому что ошибка говорит, что имя типа или пространства имен «Http» не существует в пространстве имен «System.Net» (вам не хватает ссылки на сборку?). Извините, я использую С#, не очень знакомый. - person great77; 21.01.2016
comment
Сначала вам нужно добавить ссылку в решение вашего проекта. Щелкните правой кнопкой мыши в разделе «Ссылки» -> «Добавить ссылку», найдите System.Net.Http и нажмите «Добавить». После этого вы включаете использование в верхней части файла. msdn.microsoft.com/en-us/library/wkze6zky.aspx - person jpgrassi; 21.01.2016
comment
Большое спасибо. Программа снова не имеет ошибки и говорит, что завершилась с кодом 0, однако как я могу отобразить результат в окне консоли. используется Console.Writeline (ответ). не могу видеть, что что-то выходит в качестве вывода. Еще раз спасибо - person great77; 21.01.2016
comment
Я смог просмотреть вывод с помощью Console.Read(). он отвечает на заголовки и сообщает код состояния: 401 и фразу причины неавторизованного доступа. - person great77; 21.01.2016
comment
Решил использовать Restsharp. Предыдущий дает несанкционированный доступ, код для restsharp, но на выходе только restsharp.restresponse.см. ниже var ade = new RestClient(secure.logmein.com/); var request = new RestRequest (public-api/v1/inventory/hardware/reports, Method.GET); request.AddHeader(авторизация, {\companyId\:1143,\psk\:\00_lotn3khqxkwbz8w00t078gggphj\}); request.AddHeader(принять, приложение/Json; charset=utf-8); Ответ IRestResponse = ade.Execute(запрос); - person great77; 22.01.2016
comment
Я рад сообщить вам, что скрипт теперь подключен и работает на основе RESTAPI, который дает тот же результат, что и AUTOIT. У меня нулевой токен и токен с истекшим сроком действия. Сервер веб-страницы LogmeIN не извлекает отчет для отчета об инвентаризации, я отправлю еще один вопрос о другом API, если он может получить отчет об инвентаризации. Ваше здоровье. - person great77; 22.01.2016
comment
Спасибо. Проблема с этим API заключается в том, что я не могу получить информацию, потому что он говорит, что срок действия токена null истекает. Я связывался с Logmein, и они сказали, что это не их сервер. Я смотрю на использование другой веб-страницы API. Два рабочих скрипта, которые у меня есть autoit, дают точно такой же результат. - person great77; 22.01.2016