在C ++,Windows API UWP中发送HttpRequestMessage

时间:2017-01-02 14:43:11

标签: c++ uwp

这不是C ++ / CLI。这是UWP C ++ / CX

我正在尝试在C ++中的托管类之外发送HttpRequestMessage。我查看了UWP示例,但是他们的请求发生在托管类中。

我想做的就是发送请求,然后有一个回调函数。我不需要花哨的异步/等待模式。这看起来比应该的困难得多。

编辑:我已经让它工作,但错误处理是残暴的。来自UWP HttpClient示例的额外错误处理代码未编译。

client = ref new Windows::Web::Http::HttpClient();
client->DefaultRequestHeaders->UserAgent->Append(ref new Windows::Web::Http::Headers::HttpProductInfoHeaderValue("Windows", "10"));
cancellation_token_source cancellationTokenSource = cancellation_token_source();

create_task(client->SendRequestAsync(message)).then([=](Windows::Web::Http::HttpResponseMessage^ response)
    {
        auto operation = response->Content->ReadAsBufferAsync();
        auto task = create_task(operation);
        if (task.wait() == task_status::completed)
        {
            webResponse->statusCode = (int)response->StatusCode;
            auto buffer = task.get();
            size_t length = buffer->Length;
            if (length > 0)
            {
                Array<byte>^ array = nullptr;
                CryptographicBuffer::CopyToByteArray(buffer, &array);
                webResponse->contentLength = array->Length;
                webResponse->data = (byte*)malloc(webResponse->contentLength);
                memcpy(webResponse->data, array->Data, webResponse->contentLength);
                delete array;
            }

            for each(IKeyValuePair<String^, String^>^ pair in response->Headers)
            {
                std::string key = PlatformStringToString(pair->Key);
                std::string value = PlatformStringToString(pair->Value);

                if (key == "Content-Type" && false)
                {
                    // Should have this for completeness, but do we really care?
                }
                else
                {
                    Web::WebHeader *header = new Web::WebHeader(key.c_str(), value.c_str());
                    webResponse->AddHeader(header);
                }
            }

            if (request->receiveDoneCallback)
                request->receiveDoneCallback(webResponse, request->userPtr);
        }
        else
            abort();

        delete request;
        delete response;
    });

0 个答案:

没有答案