Среда, 21 Ноября 2018, 17:28

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Программирование .NET » отправка запросов http получение и обработка результата (Нжна помощь в написании программы которая работае с http зап)
отправка запросов http получение и обработка результата
CSharpAДата: Четверг, 11 Октября 2018, 18:08 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем привет!
Учусь писать приложение на C# пока делаю все в на шаблоне консольного приложения.

так вот немного теории того что должно уметь мое приложение
Приложение делает авторизацию на сервере

далее приложение делает еще один запрос такого типа
type=togetthedetails&id=zfvf456d
сервер при этом вернет ответ типа balans - 10

далее

Приложение отправляет на ресурс запрос типа type=replacesession&id=zfvf456d&win dowslogin=Саша
сервер при этом вернет ответ типа status - expect

после чего приложение должно начать делать запросы каждую секунду в течении одной минуты
запрос такой
type=status&id=zfvf456d&windowslogi n=Саша
сервер при этом может ответить expect и если он так ответил и минута еще не прошла приложение должно продолжать делать такие запросы пока не получит ответ типа
Port - 15987, Login - Саша, Password - S1z8Q4tW1, ip - 152.54.42.198, type - remoteapp

все значения этих данных необходимо положить в отдельные переменные

так вот у меня проблема в следующем

подключиться к сайту и получить ответ у меня получилось но я никак не могу нафти информацию о том как условием проверить что в ответе, ка кразложить ответ на переменные, ка кзапустить цикл на одну минуту что бы делать запросы, и еще не могу понять как сночало подключится к сайту а затем отправлять запросы не один а несколько запросов

вот код моего приложения

Код:

Код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {

            HttpWebResponse result = null;
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://мой сайт/handlers/exchange/1c_exchange.php?");
            req.UserAgent = "Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+NT+5.0)";
            req.Credentials = new NetworkCredential("admin", "admin");
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";

            byte[] SomeBytes = null;
            string FormParams = "type=sale&mode=checkauth";
            SomeBytes = Encoding.UTF8.GetBytes(FormParams);
            req.ContentLength = SomeBytes.Length;
            Stream newStream = req.GetRequestStream();

            newStream.Write(SomeBytes, 0, SomeBytes.Length);
            newStream.Close();
            result = (HttpWebResponse)req.GetResponse();

            // выводим результат в консоль
            StreamReader myStreamReader = new StreamReader(result.GetResponseStream(), Encoding.GetEncoding(1251));
            string subString1 = myStreamReader.ReadToEnd();

            Console.WriteLine(subString1);
      

            Console.Read();

        }
    }
}
zhuravelsvДата: Четверг, 11 Октября 2018, 18:33 | Сообщение # 2
почетный гость
Сейчас нет на сайте
HttpWebResponse HttpWebRequest немного устаревшие штуки, используй для этого более "высокоуровневый" HttpClient, в твоём случае делай так:
Код
static void Main(string[] args)
{
//Что бы получить возможность работать с асинхронным кодом в консоли
Task.Run(Work).Wait();
}

public static async Task Work()
{
var client = new HttpClient();
//Здесь ты получаешь ответ (в виде html или json или что там твой сайт/сервер отдаёт, в общем строка, как видишь гораздо проще чем в твоём примере), с PostAsync думаю тоже разберёшься уже сам (если строку постишь используй StringContent)
string content = await (await client.GetAsync("https://<строка запроса>")).Content.ReadAsStringAsync();
//ну а дальше работай с переменной content как хочешь, там у тебя строковые данные
//P.S. код писал прямо сюда, не проверял, так что возможно есть синтаксические ошибки
}


Разработка программного обеспечения для ОС Windows и Android, клиент-серверные, облачные приложения, работа с БД и многое другое - https://www.weblancer.net/users/zhuravelsv/

Сообщение отредактировал zhuravelsv - Четверг, 11 Октября 2018, 21:35
CSharpAДата: Четверг, 11 Октября 2018, 18:41 | Сообщение # 3
был не раз
Сейчас нет на сайте
Спасибо буду юзать HttpClient(); юзал HttpWebRequest так как еще совсе мне знаю C# нашел пару статей и делал как попало )

за код огромное спасибо

но сразу несколько вопросов у меня на сайте авторизацию производит через апатч в своем примере что бы авторизироватться я юзал .Credentials = new NetworkCredential("admin", "admin"); где понятно что логин и пароль равны admin

как мне проходить авторизацию теперь юзая HttpClient()?

и еще я еще очень плохо знаю синтаксис C# тоесть совсем его не знаю (Знаю PHP,JS, 1C) вот стало интересно учить C

в общем ближе к телу мне в любом случае я описал что я верну с сайта данные через запятую я не очень понимаю какие методы использовать что бы разобрать строку на переменные?

Добавлено (11 Октября 2018, 20:02)
---------------------------------------------
Что тодобавил Ваш код но никак е могу избавится от ошибки
Ошибка CS0121 Неоднозначный вызов следующих методов или свойств: 'Task.Run(Action)" и "Task.Run(Func<Task>)"

zhuravelsvДата: Четверг, 11 Октября 2018, 20:25 | Сообщение # 4
почетный гость
Сейчас нет на сайте
async void Work() это сделай вот так async Task Work()

Добавлено (11 Октября 2018, 20:25)
---------------------------------------------
Credentials: https://stackoverflow.com/questions/10292730/httpclient-getasync-with-network-credentials

Добавлено (11 Октября 2018, 20:27)
---------------------------------------------
что бы постить не строку а форму есть вот такой контент-тип FormUrlEncodedContent (класс который наследуется вроде от HttpContent), гугл в помощь :)


Сообщение отредактировал zhuravelsv - Четверг, 11 Октября 2018, 20:28
CSharpAДата: Четверг, 11 Октября 2018, 20:42 | Сообщение # 5
был не раз
Сейчас нет на сайте
Вот этот код вроде работает но я опять же не понимаю как мне отправлять следующий запрос в какой строке этого кода и как?

с условиями я вроде бы уже разобрался но как сделать как я описал в первом посте о том что бы если по предпоследнему запросу вернулся ответ ожидайте программа начинала слать один и тот же запрос много раз целую минуту

Код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net;

namespace HTTP_Test
{
    class program
    {
        static void Main()
        {
            Task t = new Task(HTTP_GET);
            t.Start();
            Console.ReadLine();
        }

        static async void HTTP_GET()
        {
            var TARGETURL = "https://site.by/handlers/exchange/1c_exchange.php?type=sale&mode=checkauth";

            HttpClientHandler handler = new HttpClientHandler()
            {
                Proxy = new WebProxy("http://127.0.0.1:8888"),
                UseProxy = false,
            };

            Console.WriteLine("GET: + " + TARGETURL);

            // ... Use HttpClient.            
            HttpClient client = new HttpClient(handler);

            var byteArray = Encoding.ASCII.GetBytes("admin:admin");
            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));

            HttpResponseMessage response = await client.GetAsync(TARGETURL);
            HttpContent content = response.Content;

            // ... Check Status Code                    
            Console.WriteLine("Response StatusCode: " + (int)response.StatusCode);
           
            // ... Read the string.
            string result = await content.ReadAsStringAsync();

            if(result=="ok")
            Console.WriteLine(result);
            else
            Console.WriteLine("No ok" + result);
            // ... Display the result.
            if (result != null &&
            result.Length >= 50)
            {
                Console.WriteLine(result.Substring(0, 50) + "...");
            }
        }
    }
}
zhuravelsvДата: Четверг, 11 Октября 2018, 21:29 | Сообщение # 6
почетный гость
Сейчас нет на сайте
проверяешь результат result и если там есть нужное значение то в цикле шлёшь запросы
Код
if(result.Contains("ожидайте"))
{
    while(true)
    {
          result = await (await client.GetAsync("https://......")).Content.ReadAsStringAsync(); //опять отправляешь запрос (важно: [u]не создавай клиент для каждого запроса[/u], вместо этого создай один для всех вопросов (если возможно))
          if(result.contains("всё ок го дальше")) //если результат содержит нужную строку
               break; ///выходишь из цикла и делаешь что дальше нужно
          else //если нет
               await Task.Delay(1000); // ждёшь секунду
    }
}

Добавлено (11 Октября 2018, 21:34)
---------------------------------------------
и ещё: new Task().Start() не лучший вариант запуска тасков, вместо этого юзай Task.Run (как в моём примере)

CSharpAДата: Воскресенье, 14 Октября 2018, 08:37 | Сообщение # 7
был не раз
Сейчас нет на сайте
Спасибо буду пробовать!

но у меня еще вопрос

как вывести текст на форму

на форме я создал элемент lebel1

почему то в одном участке кода я пишу lebel1.text = "Hi mir";
то все хорошо тест выводится а в другом участке кода ругается что нету типа такого элемента

я решил что надо обратиться к форме

написал так

Form1.Но тут я не вижу своего lebel1

начал пробовать все что есть после form1.
пишу так
Form1.FromChildHandle.label2.Text = "На Вашем счету: " + Convert.ToDecimal(contentss.Replace('.', ',')) + " BYN";
получаю ошибку
Ошибка CS0119 'Control.FromChildHandle(IntPtr)" является метод, который недопустим в данном контексте.
пишу так
Form1.FromHandle.label2.Text = "На Вашем счету: " + Convert.ToDecimal(contentss.Replace('.', ',')) + " BYN";
получаю ошибку
Ошибка CS0119 'Control.FromHandle(IntPtr)" является метод, который недопустим в данном контексте. ConnectServer

опять же облазил весь интернет но примера подходящего мне не нашел (

помогите

Добавлено (14 Октября 2018, 09:47)
---------------------------------------------
Получилось Спасибо!

Добавлено (14 Октября 2018, 11:24)
---------------------------------------------
теперь проблема другая все данные
я передаю зашифрованными из API в MD5 как в коде C# расшифровать эти самые данные?
или же никак?

zhuravelsvДата: Воскресенье, 14 Октября 2018, 12:12 | Сообщение # 8
почетный гость
Сейчас нет на сайте
Цитата CSharpA ()
MD5 как в коде C# расшифровать эти самые данные?
или же никак?

MD5 это хеш, что бы шифровать/дешифровать используй, например, Rijndael
CSharpAДата: Четверг, 25 Октября 2018, 03:58 | Сообщение # 9
был не раз
Сейчас нет на сайте
Привет! мне с ново нужна помощь!

как видно я передаю на php запросы произвожу на вебе какие то действия и возвращаю результат

так вот я собираюсь возвращать массив который имеет следующий вид

Код
array (2) {
  [name] =>"zero_a"
  [login] => "two_a"
}


в общем если честно то я не совсем правильно могу привести пример как выглядит данный массив я как то это в голове себе представляю и все(

могу привести пример как я создаю такой массив и как его читаю на php

вот так я создаю массив
Код
$arr = new stdClass;
    $arr ->name     = "Вася пупкин";
    $arr ->address  = "Москва";
    $arr ->status    = 0;


вот так я его читаю

Код
foreach ($arr $arr) {
print 'имя  '.$arr->name.'  Адрес '.$arr->address.'  Статус '.$arr->status    ;
    }


но это на php

как прочесть данный массив на C#

я сделал так

Код
foreach (char arrs in contentss1)
                {
                    textBox1.Text = textBox1.Text + "\r\n " + arrs;
                    textBox1.SelectionStart = textBox1.Text.Length;
                    textBox1.ScrollToCaret();
                }


но он мне выводит каждую букву отдельно (

а если делаю как в php выводит ошибки (
cherepetsДата: Четверг, 25 Октября 2018, 04:58 | Сообщение # 10
почетный гость
Сейчас нет на сайте
1) Что такое contentss1? Покажи откуда он берется, как заполняется.
2) char arrs. Тип char - это один символ (одна буква). String это строка (много букв).
zhuravelsvДата: Четверг, 25 Октября 2018, 19:24 | Сообщение # 11
почетный гость
Сейчас нет на сайте
Предположу что у тебя ответ от сервера в json'e, если я угадал делай примерно так:
//contentss1 - это у тебя строка, как я понял (тип string)

1. Установи с нугета пакет Newtonsoft.JSON (самый первый пакет в списке с самым большим количеством загрузок, около 100млн)

2. Нужно распарсить строку (в которой твой json-ответ от сервера), вот так:
dynamic json = JObject.Parse(contentss1);

3. дальше работаешь с джсоном так:
string name = json.name;
string address = json.address;
string status = json.status;

можешь создать свой класс для этого типа джсона и десереализовать с помощью JSonDeserializer'a
CSharpAДата: Пятница, 26 Октября 2018, 13:28 | Сообщение # 12
был не раз
Сейчас нет на сайте
Цитата cherepets ()
1) Что такое contentss1? Покажи откуда он берется, как заполняется.
2) char arrs. Тип char - это один символ (одна буква). String это строка (много букв).


contentss1 это ответ сервера там массив построенные php (не json)

Добавлено (26 Октября 2018, 13:29)
---------------------------------------------
zhuravelsv

спасибо буду пробовать (что то не подумал о json)

cherepetsДата: Пятница, 26 Октября 2018, 13:31 | Сообщение # 13
почетный гость
Сейчас нет на сайте
CSharpA,
Не json, а что? Если это просто строка с разделителем, то можешь попробовать разбивать через Split.
Например, contentss1.Split(',')
CSharpAДата: Пятница, 26 Октября 2018, 13:36 | Сообщение # 14
был не раз
Сейчас нет на сайте
Если я верно понимаю на стороне PHP я так же строю
массив
Код

$arr = new stdClass;
    $arr ->name     = "Вася пупкин";
    $arr ->address  = "Москва";
    $arr ->status    = 0;


но перед отправкой пакую его в json

Код
$json_str = json_encode($arr);


после принтую как результат в ответ

Код
print $json_str;


а на стороне C# принимаю ответ таким способом

Код
dynamic json = JObject.Parse(contentss1);

string name = json.name; // Наименование из моего массива
string address = json.address;//Адрес
string status = json.status;//статус


но вопрос теперь стоит в том что если я передам многомерный массив?

то-есть если будет так
код php
Код
$arr = new stdClass;
    $arr ->name     = "Вася пупкин";
    $arr ->address  = "Москва";
    $arr ->status    = 0;
    $arr ->images  = url;//это пример


то-етсь получается что в массиве arr есть еще один массив с изображениями юзера
как мне прочитать его на C#?
спасибо за ранее.

Добавлено (26 Октября 2018, 14:45)
---------------------------------------------
прошу прощения ) вот верный код

Код
$arr = new stdClass;
    $arr ->name     = "Вася пупкин";
    $arr ->address  = "Москва";
    $arr ->status    = 0;
    $arr ->images->url  = url;//это пример

Добавлено (26 Октября 2018, 15:56)
---------------------------------------------

Цитата cherepets ()
Не json, а что? Если это просто строка с разделителем, то можешь попробовать разбивать через Split.
Например, contentss1.Split(',')


вот код php который отдает ответ на запрос с сервера

Код
$arr = new stdClass;
    $arr ->name     = "Вася пупкин";
    $arr ->address  = "Москва";
    $arr ->status    = 0;

print $arr;


я не оборачивал все это добро в json_encode($arr); теперь буду обарачивать!

Добавлено (26 Октября 2018, 16:35)
---------------------------------------------
использую этот код но теперь ошибка

Имя "JObject" не существует в текущем контексте.

искал но не нашел в ссылках такой деррективы что делать?

использую Microsoft Visual Studio Profissional 2017

Код
dynamic json = JObject.Parse(contentss1);

string name = json.name; // Наименование из моего массива
string address = json.address;//Адрес
string status = json.status;//статус

Добавлено (26 Октября 2018, 17:04)
---------------------------------------------
проблему решил сам

Код
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Microsoft.CSharp.RuntimeBinder;


прошу если не сложно ответьте по вопросам что выше о вложенных массивах спасибо заранее
zhuravelsvДата: Пятница, 26 Октября 2018, 19:11 | Сообщение # 15
почетный гость
Сейчас нет на сайте
ну точно так же и с массивом работаешь:
foreach(string url in json.images)
{
//... Если images это тоже джсон обьект а не значение (строка/число) то используй dynamic а дальше как обычно
}
CSharpAДата: Суббота, 27 Октября 2018, 06:13 | Сообщение # 16
был не раз
Сейчас нет на сайте
Доброе утро!, День, вечер :-)

продолжаю учиться )

теперь вопрос касаемо данных создал фору авторизации вроде все ок авторизация проходит НО мне нужно с формы авторизации передать значения элементов и переменных на другую форму

подскажите как правильно делать
спасибо!

Добавлено (27 Октября 2018, 06:26)
---------------------------------------------
пробовал делать так! но не работает . ошибок нет! так как сделано верно НО ошибка на самом еле есть! так как форма1 еще не загружена а потому передаю я или нет что либо в переменную значения не имеет может мне нужно создать какие то глобильные переменные сохранять их в пределах работы программы но как это сделать?

Добавлено (27 Октября 2018, 06:42)
---------------------------------------------
хм... опять решил задачу (правда не знаю насколько верно) но думаю для самообучения этого хватит )

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

Код
   static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        ///
        public static string MyGlobalVar1;
        public static string MyGlobalVar2;


теперь в форме 2 это форма авторизации присваиваю значение

Код
Program.MyGlobalVar1 = LoginF.Text;


а в форме 1 забираю

Код
textBox2.Text = Program.MyGlobalVar1;

Добавлено (27 Октября 2018, 06:45)
---------------------------------------------
еще интересный вопрос я привык работать в 1с 8 в ней есть отделбные модули для кода

(общие модули)

они предназначены для того что бы разгрузит ьскажем модуль формы или например для того если для разных форм или приложений нужно использовать одинаковые методы кода (функции)

например какие то пересчеты и т д

как в visual studio pr 2017 сделать отдельные глобальные модули как в 1с 8 что бы их можно было юзать из любого места программы?

Добавлено (27 Октября 2018, 06:47)
---------------------------------------------
или же если можно то помещать отдельные коды в отдельные файлы ато у меня программа уже достаточно большая а состоит всего после компиляции из одного файла (

zhuravelsvДата: Суббота, 27 Октября 2018, 17:42 | Сообщение # 17
почетный гость
Сейчас нет на сайте
Цитата CSharpA ()
как в visual studio pr 2017 сделать отдельные глобальные модули как в 1с 8 что бы их можно было юзать из любого места программы?

гугли что такое ооп и классы в c# %)
CSharpAДата: Суббота, 27 Октября 2018, 21:07 | Сообщение # 18
был не раз
Сейчас нет на сайте
что то не получается прочитать массив (

{{ "8": { "name": "Администратор" }, "10": { "name": "Вера" }, "11": { "name": "Антон" }, "14": { "name": "Антон_1" }, "12": { "name": "ЛюксПроект1" }, "9": { "name": "Наташа" }, "13": { "name": "Сан" }}}

пытаюсь читать так

Код
HttpResponseMessage results34 = await client.GetAsync(Urls + "type=serverautorized&mode=getusers");
            HttpContent contents34 = results34.Content;
            string contentss34 = await contents34.ReadAsStringAsync();

            dynamic json = JObject.Parse(contentss34);
            int a = 0;//содержимое массива получил путем установки точки останова здесь на этой строке содержимое лежало в json
            foreach (var user in json)
            {
                listUsers.Items.Insert(a, user.Value.ToString());//здесь я пытаюсь присвоить списку имя юзера
                a = a + 1;
            }


в итоге в listUsers я получаю вот это

{"name": "Администратор"}
{"name": "Вера"}
{"name": "Антон"}
{"name": "Антон_1"}
{"name": "ЛюксПроект1"}
{"name": "Наташа"}
{"name": "Сан"}

что не так?

массив готовлю так в php

Код
$filter = array();
    $filter['limit'] = 2000;
  
    $listusers = array();
    $users = $general->users->get_users($filter);
      if($users){
      foreach ($users as $user) {
           $listusers[$user->id]['name'] = $user->name;

      }
      }
    $json_str = json_encode($listusers);
    print $json_str;    
cherepetsДата: Понедельник, 29 Октября 2018, 06:59 | Сообщение # 19
почетный гость
Сейчас нет на сайте
Думаю, стоит перейти с dynamic на парсинг сразу в готовый класс, чтобы ничего уже руками не собирать.
Что сделать автоматом класс соответствующий твоему json можно скопировать json в буффер обмена и нажать в Visual Studio: Edit -> Paste Special -> Paste JSON As Classes.
zhuravelsvДата: Понедельник, 29 Октября 2018, 19:29 | Сообщение # 20
почетный гость
Сейчас нет на сайте
Цитата cherepets ()
Что сделать автоматом класс соответствующий твоему json можно скопировать json в буффер обмена и нажать в Visual Studio: Edit -> Paste Special -> Paste JSON As Classes.

Круто, не знал что студия сама может генерировать классы на основе json lovegcup
Цитата CSharpA ()
что не так?

Цитата CSharpA ()
user.Value.ToString()

попробуй user.Value.name, должно сработать


Разработка программного обеспечения для ОС Windows и Android, клиент-серверные, облачные приложения, работа с БД и многое другое - https://www.weblancer.net/users/zhuravelsv/
Форум игроделов » Программирование » Программирование .NET » отправка запросов http получение и обработка результата (Нжна помощь в написании программы которая работае с http зап)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2018 Рейтинг