C++ 用C++;,Windows API UWP

C++ 用C++;,Windows API UWP,c++,uwp,C++,Uwp,这不是C++/CLI。这是UWP C++/CX 我试图在C++中在托管类之外发送一个HTTPREQUEST消息。我查看了UWP示例,但它们的请求发生在托管类中 我要做的就是发送请求,然后使用回调函数。我不需要花哨的异步/等待模式。这看起来比应该的困难得多 编辑:我已经让它工作了,但是错误处理非常糟糕。未编译UWP HttpClient示例中的额外错误处理代码 client = ref new Windows::Web::Http::HttpClient(); client->Default

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

我试图在C++中在托管类之外发送一个HTTPREQUEST消息。我查看了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;
    });
client=ref新建Windows::Web::Http::HttpClient();
客户端->默认请求头->用户代理->附加(参考新的Windows::Web::Http::Headers::HttpProductInfoHeaderValue(“Windows”,“10”);
取消\令牌\源取消令牌源=取消\令牌\源();
创建任务(客户端->发送请求异步(消息))。然后([=](Windows::Web::Http::HttpResponseMessage^response)
{
自动操作=响应->内容->ReadAsBufferAsync();
自动任务=创建任务(操作);
if(task.wait()==任务状态::已完成)
{
webResponse->statusCode=(int)response->statusCode;
自动缓冲区=task.get();
大小\u t长度=缓冲区->长度;
如果(长度>0)
{
数组^Array=nullptr;
CryptographicBuffer::CopyToByteArray(缓冲区和数组);
webResponse->contentLength=array->Length;
webResponse->data=(字节*)malloc(webResponse->contentLength);
memcpy(webResponse->data,array->data,webResponse->contentLength);
删除数组;
}
对于每个(IKeyValuePair^响应中的pair->Headers)
{
std::string key=PlatformStringToString(对->键);
std::string value=PlatformStringToString(对->值);
如果(键==“内容类型”&&false)
{
//应该有完整性,但我们真的在乎吗?
}
其他的
{
Web::WebHeader*header=newweb::WebHeader(key.c_str(),value.c_str());
webResponse->AddHeader(标题);
}
}
如果(请求->接收返回)
request->receiveDoneCallback(webResponse,request->userPtr);
}
其他的
中止();
删除请求;
删除响应;
});

请详细说明“托管类之外”是什么意思?您所引用的示例是什么?我是指非C++/CX函数。比如“静态void Blah()”。我熟悉使用旧的WinHTTP API。我仍然不确定您到底想要什么。您是否想用标准的C++语言代替C++或CX在UWP应用程序中发送HTTP请求?你能告诉我你参考的是哪个样本吗?我已经让它工作了,但是代码一点也不干净,也没有错误处理。我不记得是哪个示例,它是HttpClient C++/CX UWP示例。这里处理错误的正确方法是什么?