implemented requests
This commit is contained in:
commit
ba2ca206bd
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
bin/
|
||||
obj/
|
||||
13
.idea/.idea.PlatonusSchedule/.idea/.gitignore
vendored
Normal file
13
.idea/.idea.PlatonusSchedule/.idea/.gitignore
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Rider ignored files
|
||||
/contentModel.xml
|
||||
/modules.xml
|
||||
/projectSettingsUpdater.xml
|
||||
/.idea.PlatonusSchedule.iml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
3
.idea/.idea.PlatonusSchedule/.idea/dictionaries/User.xml
Normal file
3
.idea/.idea.PlatonusSchedule/.idea/dictionaries/User.xml
Normal file
@ -0,0 +1,3 @@
|
||||
<component name="ProjectDictionaryState">
|
||||
<dictionary name="User" />
|
||||
</component>
|
||||
4
.idea/.idea.PlatonusSchedule/.idea/encodings.xml
Normal file
4
.idea/.idea.PlatonusSchedule/.idea/encodings.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
|
||||
</project>
|
||||
8
.idea/.idea.PlatonusSchedule/.idea/indexLayout.xml
Normal file
8
.idea/.idea.PlatonusSchedule/.idea/indexLayout.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="UserContentModel">
|
||||
<attachedFolders />
|
||||
<explicitIncludes />
|
||||
<explicitExcludes />
|
||||
</component>
|
||||
</project>
|
||||
@ -0,0 +1,5 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
</profile>
|
||||
</component>
|
||||
6
.idea/.idea.PlatonusSchedule/.idea/markdown.xml
Normal file
6
.idea/.idea.PlatonusSchedule/.idea/markdown.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="MarkdownSettings">
|
||||
<option name="fileGroupingEnabled" value="true" />
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/.idea.PlatonusSchedule/.idea/misc.xml
Normal file
6
.idea/.idea.PlatonusSchedule/.idea/misc.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="MarkdownSettingsMigration">
|
||||
<option name="stateVersion" value="1" />
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/.idea.PlatonusSchedule/.idea/vcs.xml
Normal file
6
.idea/.idea.PlatonusSchedule/.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
10
Platonus.API/DataModels/LoginResponse.cs
Normal file
10
Platonus.API/DataModels/LoginResponse.cs
Normal file
@ -0,0 +1,10 @@
|
||||
namespace Platonus.API.DataModels;
|
||||
|
||||
class LoginResponse
|
||||
{
|
||||
/// session_id
|
||||
public string? sid { get; set; }
|
||||
public string? auth_token { get; set; }
|
||||
/// should be "success"
|
||||
public string? login_status { get; set; }
|
||||
}
|
||||
8
Platonus.API/DataModels/ScheduleRequest.cs
Normal file
8
Platonus.API/DataModels/ScheduleRequest.cs
Normal file
@ -0,0 +1,8 @@
|
||||
namespace Platonus.API.DataModels;
|
||||
|
||||
public class ScheduleRequest
|
||||
{
|
||||
public int statusID { get; set; } = 1;
|
||||
public int studentTypeID { get; set; } = 1;
|
||||
public int week { get; set; } = 1;
|
||||
}
|
||||
47
Platonus.API/LoggindHttpHandler.cs
Normal file
47
Platonus.API/LoggindHttpHandler.cs
Normal file
@ -0,0 +1,47 @@
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Platonus.API;
|
||||
|
||||
public class LoggindHttpHandler : DelegatingHandler
|
||||
{
|
||||
public LoggindHttpHandler(HttpMessageHandler innerHandler) : base(innerHandler)
|
||||
{ }
|
||||
|
||||
void LogHttpRequest(HttpRequestMessage req)
|
||||
{
|
||||
Console.WriteLine($"REQUEST {req.Method} to {req.RequestUri}: " +
|
||||
req.Content?.ReadAsStringAsync().GetAwaiter().GetResult());
|
||||
}
|
||||
|
||||
void LogHttpResponse(HttpResponseMessage res)
|
||||
{
|
||||
Console.WriteLine($"RESPONSE {res.StatusCode} ({(int)res.StatusCode}) from {res.RequestMessage?.RequestUri}: " +
|
||||
res.Content.ReadAsStringAsync().GetAwaiter().GetResult());
|
||||
if (res.Headers.TryGetValues("Set-Cookie", out var cookieHeaders))
|
||||
foreach (var cookieHeader in cookieHeaders)
|
||||
{
|
||||
Console.WriteLine($" Set-Cookie: {cookieHeader}");
|
||||
}
|
||||
}
|
||||
|
||||
#if !NETSTANDARD2_0
|
||||
protected override HttpResponseMessage Send(HttpRequestMessage req, CancellationToken cancellationToken)
|
||||
{
|
||||
LogHttpRequest(req);
|
||||
var res = base.Send(req, cancellationToken);
|
||||
LogHttpResponse(res);
|
||||
return res;
|
||||
}
|
||||
#endif
|
||||
|
||||
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage req, CancellationToken cancellationToken)
|
||||
{
|
||||
LogHttpRequest(req);
|
||||
var res = await base.SendAsync(req, cancellationToken);
|
||||
LogHttpResponse(res);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
20
Platonus.API/LoginCredentials.cs
Normal file
20
Platonus.API/LoginCredentials.cs
Normal file
@ -0,0 +1,20 @@
|
||||
namespace Platonus.API;
|
||||
|
||||
public struct LoginCredentials
|
||||
{
|
||||
/// <summary>
|
||||
/// student_id@iitu.edu.kz
|
||||
/// </summary>
|
||||
public readonly string Login;
|
||||
|
||||
public readonly string Password;
|
||||
|
||||
public readonly PlatonusLanguage Language;
|
||||
|
||||
public LoginCredentials(string login, string password, PlatonusLanguage language)
|
||||
{
|
||||
Login = login;
|
||||
Password = password;
|
||||
Language = language;
|
||||
}
|
||||
}
|
||||
17
Platonus.API/Platonus.API.csproj
Normal file
17
Platonus.API/Platonus.API.csproj
Normal file
@ -0,0 +1,17 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>netstandard2.0;net6.0;net7.0</TargetFrameworks>
|
||||
<LangVersion>11</LangVersion>
|
||||
<ImplicitUsings>disable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<RootNamespace>Platonus.API</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="System.Net.Http" Version="4.3.4" />
|
||||
<PackageReference Include="System.Net.Http.Json" Version="7.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
</Project>
|
||||
103
Platonus.API/PlatonusClient.cs
Normal file
103
Platonus.API/PlatonusClient.cs
Normal file
@ -0,0 +1,103 @@
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Net.Http.Json;
|
||||
using System.Threading.Tasks;
|
||||
using Platonus.API.DataModels;
|
||||
|
||||
namespace Platonus.API;
|
||||
|
||||
public class PlatonusClient
|
||||
{
|
||||
private const string base_url = "https://platonus.iitu.edu.kz/";
|
||||
public bool DebugHttpMessages;
|
||||
|
||||
|
||||
private LoginResponse? _loginResponse;
|
||||
private PlatonusLanguage? _language;
|
||||
private HttpClient _http;
|
||||
private CookieContainer _cookies;
|
||||
|
||||
public PlatonusClient()
|
||||
{
|
||||
#if DEBUG
|
||||
// TODO disable http messages logging
|
||||
DebugHttpMessages = true;
|
||||
#endif
|
||||
_cookies = new CookieContainer();
|
||||
var httpClientHandler = new HttpClientHandler
|
||||
{
|
||||
CookieContainer = _cookies
|
||||
};
|
||||
_http = new HttpClient(new LoggindHttpHandler(httpClientHandler))
|
||||
{
|
||||
BaseAddress = new Uri(base_url)
|
||||
};
|
||||
}
|
||||
|
||||
public async Task LoginAsync(LoginCredentials userCredentials)
|
||||
{
|
||||
string json = $$"""
|
||||
{
|
||||
"login": "{{userCredentials.Login}}",
|
||||
"password": "{{userCredentials.Password}}",
|
||||
"authForDeductedStudentsAndGraduates": "false"
|
||||
}
|
||||
""";
|
||||
var reqContent = new StringContent(json);
|
||||
reqContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
|
||||
_language = userCredentials.Language;
|
||||
reqContent.Headers.Add("language", _language.Number.ToString());
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
// send POST request
|
||||
var res = await _http.PostAsync("rest/api/login", reqContent);
|
||||
// parse json
|
||||
if (res.Content.Headers.ContentLength < 1)
|
||||
throw new Exception("responce doesn't have any content");
|
||||
_loginResponse = await res.Content.ReadFromJsonAsync<LoginResponse>()
|
||||
?? throw new Exception("invalid login request rezult");
|
||||
if(_loginResponse.login_status != "success")
|
||||
throw new Exception("invalid login request rezult");
|
||||
|
||||
// set session id and user token headers in HttpClient
|
||||
_http.DefaultRequestHeaders.Add("sid", _loginResponse.sid);
|
||||
_http.DefaultRequestHeaders.Add("token", _loginResponse.auth_token);
|
||||
}
|
||||
catch (HttpRequestException re)
|
||||
{
|
||||
HandleRequestException(re);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task GetScheduleAsync()
|
||||
{
|
||||
if (_language is null)
|
||||
throw new Exception("language is null, you need to login");
|
||||
if (_loginResponse is null)
|
||||
throw new Exception("session id is null, you need to login");
|
||||
|
||||
try
|
||||
{
|
||||
var req = JsonContent.Create<ScheduleRequest>(new ScheduleRequest());
|
||||
var res = await _http.PostAsync(
|
||||
$"rest/schedule/userSchedule/student/initial/{_language.LiteralCode}",
|
||||
req);
|
||||
// var rezult = await res.Content.ReadFromJsonAsync<ScheduleResponseData>();
|
||||
}
|
||||
catch (HttpRequestException re)
|
||||
{
|
||||
HandleRequestException(re);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void HandleRequestException(HttpRequestException re)
|
||||
{
|
||||
// TODO http exception handling
|
||||
throw re;
|
||||
}
|
||||
}
|
||||
17
Platonus.API/PlatonusLanguage.cs
Normal file
17
Platonus.API/PlatonusLanguage.cs
Normal file
@ -0,0 +1,17 @@
|
||||
namespace Platonus.API;
|
||||
|
||||
public class PlatonusLanguage
|
||||
{
|
||||
public readonly int Number;
|
||||
public readonly string LiteralCode;
|
||||
|
||||
private PlatonusLanguage(int num, string literalCode)
|
||||
{
|
||||
Number = num;
|
||||
LiteralCode = literalCode;
|
||||
}
|
||||
|
||||
public static PlatonusLanguage English = new(0, "en");
|
||||
public static PlatonusLanguage Russian = new(1, "ru");
|
||||
public static PlatonusLanguage Kazakh = new(2, "kz");
|
||||
}
|
||||
15
PlatonusSchedule.CLI/PlatonusSchedule.CLI.csproj
Normal file
15
PlatonusSchedule.CLI/PlatonusSchedule.CLI.csproj
Normal file
@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<LangVersion>10</LangVersion>
|
||||
<ImplicitUsings>disable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Platonus.API\Platonus.API.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
20
PlatonusSchedule.CLI/Program.cs
Normal file
20
PlatonusSchedule.CLI/Program.cs
Normal file
@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using Platonus.API;
|
||||
|
||||
var p = new PlatonusClient();
|
||||
var loginCredentials = new LoginCredentials(
|
||||
ReadString("login"),
|
||||
ReadString("password"),
|
||||
PlatonusLanguage.English);
|
||||
await p.LoginAsync(loginCredentials);
|
||||
await p.GetScheduleAsync();
|
||||
return;
|
||||
|
||||
string ReadString(string question)
|
||||
{
|
||||
Console.Write($"{question}: ");
|
||||
string? answ = Console.ReadLine();
|
||||
if (string.IsNullOrEmpty(answ))
|
||||
throw new NullReferenceException();
|
||||
return answ;
|
||||
}
|
||||
22
PlatonusSchedule.sln
Normal file
22
PlatonusSchedule.sln
Normal file
@ -0,0 +1,22 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Platonus.API", "Platonus.API\Platonus.API.csproj", "{3650802E-D79E-47FC-ADED-2D9D6AF80340}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlatonusSchedule.CLI", "PlatonusSchedule.CLI\PlatonusSchedule.CLI.csproj", "{B445963D-AB65-4138-912D-58A0A954A736}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{3650802E-D79E-47FC-ADED-2D9D6AF80340}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3650802E-D79E-47FC-ADED-2D9D6AF80340}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3650802E-D79E-47FC-ADED-2D9D6AF80340}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3650802E-D79E-47FC-ADED-2D9D6AF80340}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B445963D-AB65-4138-912D-58A0A954A736}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B445963D-AB65-4138-912D-58A0A954A736}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B445963D-AB65-4138-912D-58A0A954A736}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B445963D-AB65-4138-912D-58A0A954A736}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
Loading…
Reference in New Issue
Block a user