Информация об изменениях

Сообщение Re[15]: Как распарсить СМИ2? от 06.11.2024 14:18

Изменено 06.11.2024 14:19 Passerby

Re[15]: Как распарсить СМИ2?
Здравствуйте, karbofos42, Вы писали:

K>У меня там вызывается Generic-метод:

K>
K>public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, [StringSyntax(StringSyntaxAttribute.Uri)] string? requestUri, TValue value, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
K>

По вашей ссылке https://learn.microsoft.com/en-us/dotnet/api/system.net.http.json.httpclientjsonextensions?view=net-8.0 перечислены следующие методы:
PostAsJsonAsync<TValue>(HttpClient, String, TValue, CancellationToken)
PostAsJsonAsync<TValue>(HttpClient, String, TValue, JsonSerializerOptions, CancellationToken)
PostAsJsonAsync<TValue>(HttpClient, String, TValue, JsonTypeInfo<TValue>, CancellationToken)
PostAsJsonAsync<TValue>(HttpClient, Uri, TValue, CancellationToken)
PostAsJsonAsync<TValue>(HttpClient, Uri, TValue, JsonSerializerOptions, CancellationToken)
PostAsJsonAsync<TValue>(HttpClient, Uri, TValue, JsonTypeInfo<TValue>, CancellationToken)
1. Где ваш Generic-метод?
2. Почему нет в первом параметре this HttpClient client?
3. Почему стоит атрибут [StringSyntax(StringSyntaxAttribute.Uri)]?
4. В перечисленных методах не указаны умолчания JsonSerializerOptions? options = null, CancellationToken cancellationToken = default. Как догадались, что они есть?
5. Ни в этих методах, ни в вашем Generic-методе в параметрах нет объекта var filter = new Filter(84683, 50, 4194303);
K>Вообще, полный вызов был бы:
K>
K>client.PostAsJsonAsync<Filter>(@"https://smi2.ru/newdata/jsapi?action=articles", filter)
K>

K>но т.к. в метод передаётся параметр value, то <TValue> можно опустить и компилятор сам его добавит по типу переменной filter.

K>Для GetFromJsonAsync нужно уже явно в <> указывать данные какого типа нужно из json десериализовать и тогда он вернёт объект нужного типа


K>Если использовать вариант метода:

P>>
P>>public static System.Threading.Tasks.Task<object?> GetFromJsonAsync (this System.Net.Http.HttpClient client, string? requestUri, Type type, System.Threading.CancellationToken cancellationToken = default);
P>>

K>то в type указывается ожидаемый тип, а дальше вручную из object к нему привозить нужно. Такое бывает нужно, если тип в режиме выполнения как-то определяется.
K>Когда на этапе компиляции тип известен, то естественно удобнее и лучше использовать Generic-методы и вызывать что-то типа:
K>
K>client.GetFromJsonAsync<Article>(url)
K>
Re[15]: Как распарсить СМИ2?
Здравствуйте, karbofos42, Вы писали:

K>У меня там вызывается Generic-метод:

K>
K>public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, [StringSyntax(StringSyntaxAttribute.Uri)] string? requestUri, TValue value, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
K>

По вашей ссылке https://learn.microsoft.com/en-us/dotnet/api/system.net.http.json.httpclientjsonextensions?view=net-8.0 перечислены следующие методы:
PostAsJsonAsync<TValue>(HttpClient, String, TValue, CancellationToken)
PostAsJsonAsync<TValue>(HttpClient, String, TValue, JsonSerializerOptions, CancellationToken)
PostAsJsonAsync<TValue>(HttpClient, String, TValue, JsonTypeInfo<TValue>, CancellationToken)
PostAsJsonAsync<TValue>(HttpClient, Uri, TValue, CancellationToken)
PostAsJsonAsync<TValue>(HttpClient, Uri, TValue, JsonSerializerOptions, CancellationToken)
PostAsJsonAsync<TValue>(HttpClient, Uri, TValue, JsonTypeInfo<TValue>, CancellationToken)
1. Где ваш Generic-метод?
2. Почему нет в первом параметре this HttpClient client?
3. Почему стоит атрибут [StringSyntax(StringSyntaxAttribute.Uri)]?
4. В перечисленных методах не указаны умолчания JsonSerializerOptions? options = null, CancellationToken cancellationToken = default. Как догадались, что они есть?
5. Ни в этих методах, ни в вашем Generic-методе в параметрах нет объекта var filter = new Filter(84683, 50, 4194303);