Чтобы сохранить объект response
, который у вас есть, при извлечении тела, мы воспользуемся преимуществом того факта, что, в отличие от нескольких других платформ, вы можете извлекать тело, не разрушая весь объект. Код ниже:
actix::run(|| {
client::get("http://localhost/")
.header("User-Agent", "Actix-web")
.finish()
.unwrap()
.send()
.map_err(|e| {
Error::new(ErrorKind::AddrInUse, "Request error", e)
})
.and_then(|response| {
println!("Got response");
response.body().map(move |body_out| {
(response, body_out)
}).map_err(|e| Error::new(ErrorKind::InvalidData, "Payload error", e))
}).and_then(|(response, body)| {
println!("Response: {:?}, Body: {:?}", response, body);
Ok(())
}).map_err(|_| ())
});
В заказе:
- все, что там сейчас, использует
std::io::Error
для простоты использования. Поскольку все actix
типы ошибок реализуют Error
, также возможно сохранить исходные типы
and_then()
позволяет мне извлечь тело. Когда это будет решено, map
(с move
, удостоверяющимся, что мы берем с собой response
), затем возвращает кортеж (response, body)
- Оттуда вы можете свободно использовать либо ответ, либо тело, как считаете нужным
Обратите внимание, что я заменил ваше имя хоста на localhost
в целях тестирования, поскольку ipv4.canhasip.com
в настоящее время не разрешается ни с чем снаружи.
Первоначальный ответ:
Вы действительно должны были предоставить больше контекста по этому вопросу. actix
имеет более одного типа запроса.
Ваш начальный объект (response
) - это ClientResponse
. вызов body()
для него возвращает структуру MessageBody
, которая является началом кроличьей норы, в которую вы попали. Это NOT фактического тела, просто объект, реализующий черту Future
и который после прохождения курса даст то, что вам нужно.
Вам нужно будет сделать это менее хакерским способом, но сейчас и чтобы убедить себя, что это источник проблемы, а не строка кода, попробуйте следующее:
println!("{:?}", response.body().wait())
Вызов wait()
в будущем блокирует текущий поток, поэтому я говорю, что это временный, хакерский способ показать вам, в чем проблема. В зависимости от того, что у вас есть (если у вас есть объект, похожий на исполнителя, или вы можете вернуть будущее для выполнения), ваше реальное решение будет отличаться.