C++ 用C++;,Windows API UWP
这不是C++/CLI。这是UWP C++/CX 我试图在C++中在托管类之外发送一个HTTPREQUEST消息。我查看了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
编辑:我已经让它工作了,但是错误处理非常糟糕。未编译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示例。这里处理错误的正确方法是什么?