Я запустил новое приложение, которое использует API Omdb для получения информации о фильме. Цель приложения - получить заголовок фильма, используя ключевое слово для поиска. например: "shawshank" должен вернуть:
{"Search":[{"Title":"The Shawshank Redemption","Year":"1994","imdbID":"tt0111161","Type":"movie","Poster":"https://m.media-amazon.com/images/M/MV5BMDFkYTc0MGEtZmNhMC00ZDIzLWFmNTEtODM1ZmRlYWMwMWFmXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_SX300.jpg"},{"Title":"Shawshank: The Redeeming Feature","Year":"2001","imdbID":"tt0293927","Type":"movie","Poster":"https://m.media-amazon.com/images/M/MV5BYjgwMjNjOGUtNzU3MC00MGM5LTk4NTctNGI5N2I2NGI0YjBhXkEyXkFqcGdeQXVyMjIzMTk0MzM@._V1_SX300.jpg"},{"Title":"Hope Springs Eternal: A Look Back at 'The Shawshank Redemption'","Year":"2004","imdbID":"tt0443041","Type":"movie","Poster":"N/A"},{"Title":"The Shawshank Redemption: Cast Interviews","Year":"2004","imdbID":"tt5443390","Type":"movie","Poster":"N/A"},{"Title":"The Shawshank Redemption (Scene)","Year":"2012","imdbID":"tt2477746","Type":"movie","Poster":"N/A"},{"Title":"The Shawshank Reflection","Year":"2015","imdbID":"tt3882670","Type":"movie","Poster":"N/A"},{"Title":"The Shawshank Redemption: Behind the Scenes","Year":"2004","imdbID":"tt5443386","Type":"movie","Poster":"N/A"}],"totalResults":"7","Response":"True"}
Проблема в том, что когда я запускаю приложение формы, я пытаюсь сохранить json в объект, предполагая, что если параметры моего объекта имеют одинаковое (без учета регистра) имя, элементы JSON будут сохранены в соответствующие переменные внутри объекта. Этого не происходит, поскольку параметры объекта остаются нулевыми.
Этот код был создан после просмотра видео на YouTube о создании приложения, которое использует онлайн-комиксы с помощью API. Я хотел вместо этого вытащить названия фильмов из Omdb. Были использованы следующие нюансы: Microsoft.AspNet.WebApi.Client v5.2.7 и Newtonsoft.Json v12.0.2. Ссылка на видео, которое было использовано для этого, выглядит следующим образом:
https://www.youtube.com/watch?v=aWePkE2ReGw
Я попытался протестировать свой URL в браузере, и он успешно генерирует желаемый JSON. Я также попытался пройтись по коду и посмотреть переменные, которые я заметил, что из URL не удаляются данные. Я очень новичок в создании HTTP-соединений, а также в использовании API, так что это может быть легко исправить. После выполнения кода результаты отслеживаемых переменных выглядят следующим образом:
Name Value Type
Title "MainWindow" string
movie {Movie_application.MovieModel} Movie_application.MovieModel
Film.Title null string
url"http://www.omdbapi.com/?s=shawshank&apikey=568027e4" string
Tag null object
Title "MainWindow" string
Film {Movie_application.MovieModel} Movie_application.MovieModel
titlee null string
mainwindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Movie_application
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//Start up the tcp/ip connection via HTTPclient
APIhelper.InitializeClient();
}
private async Task LoadResponseText(string Tag)
{
//grab the movie and put it in a local variable
var Film = await MovieProcessor.LoadMovie(Tag);
//create the full url of the poster
//var uriSource = new Uri(Film.Poster, UriKind.Absolute);
//create a bitmap image out of url and put it in the display of the WP window
//MoviePoster.Source = new BitmapImage(uriSource);
Result_Text.Text = Film.Title;
}
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
await LoadResponseText("shawshank");
}
private async void SearchBtn_Click(object sender, RoutedEventArgs e)
{
await LoadResponseText(SearchBox.Text);
}
}
}
```APIhelper```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace Movie_application
{
public class APIhelper
{
public static HttpClient ApiClient { get; set; }
public static void InitializeClient()
{
//Create a new HttpClient object
ApiClient = new HttpClient();
//Clear headers out of HttpClient
ApiClient.DefaultRequestHeaders.Accept.Clear();
//Adds a header which requests a JSON data rather than web page tags etc.
ApiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
}
}
```MovieProcessor```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace Movie_application
{
public class MovieProcessor
{
public static async Task<MovieModel> LoadMovie(string search)
{
string url = "http://www.omdbapi.com/?s=" + search + "&apikey=568027e4";
//call HTTPclient to open connection and await a response from destination
using (HttpResponseMessage response = await APIhelper.ApiClient.GetAsync(url))
{
if (response.IsSuccessStatusCode)
{
//read in the response data in an asynch fashion
MovieModel movie = await response.Content.ReadAsAsync<MovieModel>();
string titlee = movie.Title;
return movie;
}
else
{
throw new Exception(response.ReasonPhrase);
}
}
}
}
}
```MovieModel```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Movie_application
{
public class MovieModel
{
public string Title { get; set; }
public string Poster { get; set; }
}
}
I expect the code to be able to write "The Shawshank Redemption" onto the form text box. The text box remains empty at the end of the run. Thanks in advance.