トルネード

毛利のメモ書き

UWP VC++ HttpClientオブジェクトを使ったREST問合せ

Visual Studio 2017 UWP C++で、HttpClientオブジェクトを使ったREST問合せ方法

xaml側ButtonTextBoxProgressRingを配置します。ButtonクリックイベントでREST問合せし結果をTextBoxに表示します。 問合せ中はProgressRingを動かすようにします。

<TextBox Name="Edit1" Width="400" Height="300" HorizontalAlignment="Left" Margin="51,120,0,0" VerticalAlignment="Top" Background="Transparent" AcceptsReturn="True" TextWrapping="Wrap" ></TextBox>
<Button Content="HttpClient" HorizontalAlignment="Left" Margin="251,450,0,0" VerticalAlignment="Top" Width="200" Height="60" Click="Button_Click_1"/>
<ProgressRing HorizontalAlignment="Left" Margin="311,450,0,0" VerticalAlignment="Top" Width="80" Height="60" IsActive="False" Name="ActivityIndicator1" />

コード

Array と WriteOnlyArray (C + + CX) | Microsoft Docs
DataReader によるデータの取得 | Microsoft Docs
C++ での非同期プログラミング - UWP app developer | Microsoft Docs

#include <ppltasks.h>
#include <codecvt>

void cpp_uwp::json_test::Button_Click_1(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    using namespace Windows::Web::Http;
    using namespace Windows::Storage::Streams;
    ActivityIndicator1->IsActive = true;
    IHttpClient^ NetHttp1 = ref new HttpClient();

    concurrency::create_task(NetHttp1->GetAsync(ref new Uri("https://url"))).then([this](IHttpResponseMessage^ res) {
        concurrency::create_task(res->Content->ReadAsBufferAsync()).then([this](IBuffer^ buf) {
            DataReader^ BufRead = DataReader::FromBuffer(buf);
            Platform::Array<unsigned char>^ arr_stream = ref new Platform::Array<unsigned char>(buf->Length);
            BufRead->ReadBytes(arr_stream);
            std::stringstream ss1;
            for (int i = 0; i < buf->Length; ++i)
            {
                ss1 << static_cast<char>(arr_stream[i]);
            }
            std::wstring_convert<std::codecvt_utf8_utf16<wchar_t> > converter;
            Edit1->Text = ref new Platform::String(converter.from_bytes(ss1.str()).c_str());
            ActivityIndicator1->IsActive = false;
        });
    });
    
}

f:id:mojeld:20180829172139g:plain

gist