- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我目前正在使用 Wt 和 boost 对用 C++11 编写的现有程序进行修改。一个问题仍然存在,我在使用 Wt::Http::Client
发布数据时总是遇到异常。
这是当前代码:
Communication.h
#ifndef COMMUNICATION_H_
#define COMMUNICATION_H_
#include <Wt/WResource>
#include <Wt/Http/Client>
#include <Wt/Http/Message>
class Communication
{
public:
static bool sendData(std::string p_sData);
static void handleHTTPResponse(boost::system::error_code err, const Wt::Http::Message& response);
private:
Communication();
~Communication();
};
#endif /* COMMUNICATION_H_ */
通讯.cpp
#include "Communication.h"
#include <Wt/WDateTime>
#include "DemtroysUtilitaires.h"
Communication::Communication()
{
}
Communication::~Communication()
{
}
bool Communication::sendData(std::string p_sData)
{
Wt::Http::Client requete;
Wt::Http::Message message;
bool bResult = false;
std::cout << "NETWORK >>> " << p_sData << std::endl;
message.addHeader("Content-type","application/json");
message.addBodyText(p_sData);
requete.done().connect(boost::bind(&Communication::handleHTTPResponse,_1,_2));
if(requete.post("http://someserver.com",message))
{
bResult = true;
}
return bResult;
}
void Communication::handleHTTPResponse(boost::system::error_code err, const Wt::Http::Message& response)
{
std::cout << "********************************************************************************" << std::endl;
std::cout << "Communication::handleHttpResponse() status : " << response.status() << std::endl;
if(err || response.status() != 200)
{
std::cerr << "Error: " << err.message() << ", " << response.status() << std::endl;
}
std::cout << "********************************************************************************" << std::endl;
}
这是堆栈跟踪:
Thread [15] 28055 [core: 3] (Suspended : Signal : SIGABRT:Aborted)
__GI_raise() at raise.c:56 0x7ffff5914cc9
__GI_abort() at abort.c:89 0x7ffff59180d8
__gnu_cxx::__verbose_terminate_handler() at 0x7ffff5f196b5
0x7ffff5f17836
std::terminate() at 0x7ffff5f17863
__cxa_throw() at 0x7ffff5f17aa2
throw_exception<boost::bad_weak_ptr>() at throw_exception.hpp:70 0x7ffff767682c
boost::detail::shared_count::shared_count() at shared_count.hpp:580 0x7ffff767682c
shared_ptr<Wt::Http::Client::Impl>() at shared_ptr.hpp:404 0x7ffff79201b8
shared_from_this() at enable_shared_from_this.hpp:49 0x7ffff79201b8
Wt::Http::Client::Impl::startTimer() at Client.C:143 0x7ffff79201b8
Wt::Http::Client::Impl::handleResolve() at Client.C:173 0x7ffff7925d2d
operator() at mem_fn_template.hpp:280 0x7ffff7924afc
operator()<boost::_mfi::mf2<void, Wt::Http::Client::Impl, const boost::system::error_code&, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> >, boost::_bi::list2<const boost::system::error_code&, const boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>&> > at bind.hpp:392 0x7ffff7924afc
operator()<boost::system::error_code, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> > at bind_template.hpp:102 0x7ffff7924afc
operator() at bind_handler.hpp:127 0x7ffff7924afc
asio_handler_invoke<boost::asio::detail::binder2<boost::_bi::bind_t<void, boost::_mfi::mf2<void, Wt::Http::Client::Impl, boost::system::error_code const&, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> >, boost::_bi::list3<boost::_bi::value<Wt::Http::Client::Impl*>, boost::arg<1> (*)(), boost::arg<2> (*)()> >, boost::system::error_code, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> > > at handler_invoke_hook.hpp:69 0x7ffff7924afc
invoke<boost::asio::detail::binder2<boost::_bi::bind_t<void, boost::_mfi::mf2<void, Wt::Http::Client::Impl, boost::system::error_code const&, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> >, boost::_bi::list3<boost::_bi::value<Wt::Http::Client::Impl*>, boost::arg<1> (*)(), boost::arg<2> (*)()> >, boost::system::error_code, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> >, boost::_bi::bind_t<void, boost::_mfi::mf2<void, Wt::Http::Client::Impl, boost::system::error_code const&, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> >, boost::_bi::list3<boost::_bi::value<Wt::Http::Client::Impl*>, boost::arg<1> (*)(), boost::arg<2> (*)()> > > at handler_invoke_helpers.hpp:37 0x7ffff7924afc
boost::asio::detail::resolve_op<boost::asio::ip::tcp, boost::_bi::bind_t<void, boost::_mfi::mf2<void, Wt::Http::Client::Impl, boost::system::error_code const&, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> >, boost::_bi::list3<boost::_bi::value<Wt::Http::Client::Impl*>, boost::arg<1> (*)(), boost::arg<2> (*)()> > >::do_complete at resolve_op.hpp:112 0x7ffff7924afc
complete() at task_io_service_operation.hpp:38 0x7ffff773cfef
do_run_one() at task_io_service.ipp:384 0x7ffff773cfef
boost::asio::detail::task_io_service::run() at task_io_service.ipp:153 0x7ffff773cfef
run() at io_service.ipp:59 0x7ffff773914c
Wt::WIOService::run() at WIOService.C:180 0x7ffff773914c
0x7ffff6bb8e7a
start_thread() at pthread_create.c:312 0x7ffff4da4182
clone() at clone.S:111 0x7ffff59d847d
通过分析堆栈跟踪,我很确定这与未实现的Wt::Http::Client
中的done()
方法有关正确,但不知道为什么!
最佳答案
我认为问题在于 Client 类实例 requete
被声明为局部变量。此外,调用 requete.post(...)
是异步的,即它将请求保存到 Wt
的内部队列中并立即完成,而无需等待消息传递。因此,Communication::sendData
方法在 Wt
内部代码处理队列之前完成。当 Wt
处理队列时,实例 requete
已经被销毁。由于这个事实,Wt::Http::Client::Impl::startTimer()
中的代码无法获取指针并抛出异常。
关于c++ - Wt::Http::Client 总是以 throw_exception<boost::bad_weak_ptr>() 结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28973787/
据我了解,HTTP POST 请求的正文大小没有限制。因此,客户端可能会在一个 HTTP 请求中发送 千兆字节 的数据。现在我想知道 HTTP 服务器应该如何处理此类请求。 Tomcat 和 Jett
在了解Web Deploy我遇到了一些讨论 http://+:80 和 http://*:80 的 netsh.exe 命令。这些是什么意思? 最佳答案 引自URLPrefix Strings (Wi
假设我有一个负载均衡器,然后是 2 个 Web 服务器,然后是一个负载均衡器,然后是 4 个应用程序服务器。 HTTP 响应是否遵循与 HTTP 请求服务相同的路径? 最佳答案 按路径,我假设您是网络
我有一个带有 uri /api/books/122 的资源,如果在客户端为此资源发送 HTTP Delete 时该资源不存在,那么相应的响应代码是什么这个 Action ?是不是404 Not Fou
是否有特定的(或约定的)HTTP 响应消息(或除断开连接之外的其他操作)来阐明服务器不接受 pipelined HTTP requests ? 我正在寻找能让客户端停止流水线化它的请求并分别发送每个请
在了解Web Deploy我遇到了一些讨论 http://+:80 和 http://*:80 的 netsh.exe 命令。这些是什么意思? 最佳答案 引自URLPrefix Strings (Wi
我有一个带有 uri /api/books/122 的资源,如果在客户端为此资源发送 HTTP Delete 时该资源不存在,那么相应的响应代码是什么这个 Action ?是不是404 Not Fou
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我使用 Mule 作为 REST API AMQP。我必须发送自定义请求方法:“PRINT”,但我收到: Status Code: 400 Bad Request The request could
我需要针对具有不同 HTTP 响应代码的 URL 测试我的脚本。我如何获取响应代码 300、303 或 307 等的示例/示例现有 URL? 谢谢! 最佳答案 您可以使用 httpbin为此目的。 例
我正在尝试编写一个程序来匹配 HTTP 请求及其相应的响应。似乎在大多数情况下一切都运行良好(当传输完全有序时,即使不是,通过使用 TCP 序列号)。 我发现的唯一问题是当我有流水线请求时。在那之后,
RESTful Web Services鼓励使用 HTTP 303将客户端重定向到资源的规范表示。它仅在 HTTP GET 的上下文中讨论主题。 这是否也适用于其他 HTTP 方法?如果客户端尝试对非
当使用chunked HTTP传输编码时,为什么服务器需要同时写出chunk的字节大小并且后续的chunk数据以CRLF结尾? 这不会使发送二进制数据“CRLF-unclean”和方法有点多余吗? 如
这个问题在这里已经有了答案: Is it acceptable for a server to send a HTTP response before the entire request has
如果我向同一台服务器发出多个 HTTP Get 请求并收到每个请求的 HTTP 200 OK 响应,我如何使用 Wireshark 判断哪个请求映射到哪个响应? 目前看起来像是发出了一个 http 请
func main() { http.HandleFunc("/", handler) } func handler(w http.ResponseWriter, r http.Request
我找不到有值(value)的 NodeJS with Typescript 教程,所以我在无指导下潜入水中,果然我有一个问题。 我不明白这两行之间的区别: import * as http from
问一个关于Are HTTP headers case-sensitive?的问题,如果 HTTP 方法区分大小写,大多数服务器如何处理“get”或“post”与“GET”或“POST”? 例如,看起来
我正在使用ASP.NET,在其中我通过动词GET接收查询,该应用程序专用于该URL。 该代码有效,但是如果用户发送的密码使http 200无效,请回答我,并在消息的正文中显示“Fail user or
Closed. This question needs details or clarity。它当前不接受答案。 想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。 9
我是一名优秀的程序员,十分优秀!