windows C++-UWP 应用中使用 HttpRequest 类
在 UWP 应用中使用 HttpRequest 类
本节演示在 UWP 应用中如何使用 HttpRequest 类。 应用程序会提供一个输入框,该输入框定义了一个 URL 资源、用于执行 GET 和 POST 操作的按钮命令和用于取消当前操作的按钮命令。
使用 HttpRequest 类
1. 在 MainPage.xaml 中,如下所示定义 StackPanel 元素。
<StackPanel HorizontalAlignment="Left" Width="440"Background="{StaticResource ApplicationPageBackgroundThemeBrush}"><TextBox x:Name="InputTextBox" TextWrapping="Wrap" Text="http://www.fourthcoffee.com/"/><StackPanel Orientation="Horizontal"><Button x:Name="GetButton" Content="Get" Background="Green" Click="GetButton_Click"/><Button x:Name="PostButton" Content="Post" Background="Blue" Click="PostButton_Click"/><Button x:Name="CancelButton" Content="Cancel" Background="Red"IsEnabled="False" Click="CancelButton_Click"/><ProgressRing x:Name="ResponseProgressRing" /></StackPanel><TextBlock x:Name="ResponseTextBlock" TextWrapping="Wrap"/>
</StackPanel>
2. 在 MainPage.xaml.h 中,添加此 #include 指令:
#include "HttpRequest.h"
3. 在 MainPage.xaml.h 中,将这些 private 成员变量添加到 MainPage 类中:
// Produces HTTP requets.
Web::HttpRequest m_httpRequest;
// Enables us to cancel the active HTTP request.
concurrency::cancellation_token_source m_cancelHttpRequestSource;
4. 在 MainPage.xaml.h 中,声明 private 方法 ProcessHttpRequest:
// Displays the result of the provided HTTP request on the UI.
void ProcessHttpRequest(concurrency::task<std::wstring> httpRequest);
5. 在 MainPage.xaml.cpp 中,添加这些 using 语句:
using namespace concurrency;
using namespace std;
using namespace Web;
6. 在 MainPage.xaml.cpp 中,实现 GetButton_Click 类的 PostButton_Click、CancelButton_Click 和 MainPage 方法。
void MainPage::GetButton_Click(Object^ sender, RoutedEventArgs^ e)
{// Create a new cancellation token source for the web request.m_cancelHttpRequestSource = cancellation_token_source();// Set up the GET request parameters.auto uri = ref new Uri(InputTextBox->Text);auto token = m_cancelHttpRequestSource.get_token();// Send the request and then update the UI.ProcessHttpRequest(m_httpRequest.GetAsync(uri, token));
}void MainPage::PostButton_Click(Object^ sender, RoutedEventArgs^ e)
{// Create a new cancellation token source for the web request.m_cancelHttpRequestSource = cancellation_token_source();// Set up the POST request parameters.auto uri = ref new Uri(InputTextBox->Text);wstring postData(L"This is sample POST data.");auto token = m_cancelHttpRequestSource.get_token();// Send the request and then update the UI.ProcessHttpRequest(m_httpRequest.PostAsync(uri, postData, token));
}void MainPage::CancelButton_Click(Object^ sender, RoutedEventArgs^ e)
{// Disable the Cancel button.// It will be re-enabled during the next web request.CancelButton->IsEnabled = false;// Initiate cancellation.m_cancelHttpRequestSource.cancel();
}
如果你的应用程序不需要取消支持,请将 concurrency::cancellation_token::none 传递给 HttpRequest::GetAsync 和 HttpRequest::PostAsync 方法。
7. 在 MainPage.xaml.cpp 中,实现 MainPage::ProcessHttpRequest
方法。
// Displays the result of the provided HTTP request on the UI.
void MainPage::ProcessHttpRequest(task<wstring> httpRequest)
{// Enable only the Cancel button.GetButton->IsEnabled = false;PostButton->IsEnabled = false;CancelButton->IsEnabled = true;// Clear the previous response and start the progress ring.ResponseTextBlock->Text = "";ResponseProgressRing->IsActive = true;// Create a continuation that shows the results on the UI.// The UI must be updated on the ASTA thread. // Therefore, schedule the continuation to run on the current context.httpRequest.then([this](task<wstring> previousTask){try{//// Show the result on the UI.wstring response = previousTask.get();if (m_httpRequest.GetStatusCode() == 200){// The request succeeded. Show the response.ResponseTextBlock->Text = ref new String(response.c_str());}else{// The request failed. Show the status code and reason.wstringstream ss;ss << L"The server returned "<< m_httpRequest.GetStatusCode()<< L" ("<< m_httpRequest.GetReasonPhrase()<< L')';ResponseTextBlock->Text = ref new String(ss.str().c_str());}}catch (const task_canceled&){// Indicate that the operation was canceled.ResponseTextBlock->Text = "The operation was canceled";}catch (Exception^ e){// Indicate that the operation failed.ResponseTextBlock->Text = "The operation failed";// TODO: Handle the error further.(void)e;}// Enable the Get and Post buttons.GetButton->IsEnabled = true;PostButton->IsEnabled = true;CancelButton->IsEnabled = false;// Stop the progress ring.ResponseProgressRing->IsActive = false;}, task_continuation_context::use_current());
}
8. 在项目属性中,在“链接器”的“输入”下,指定 shcore.lib 和 msxml6.lib。
这是正在运行的应用程序:
全文完。