Search code examples
rusthyper

No method named `post` found for type `hyper::Client` in Hyper 0.11


I want use to Hyper for crafting HTTP requests. Calling Client::get works fine but other methods such as Client::post and Client::head cause an compilation error.

extern crate futures;
extern crate hyper;
extern crate tokio_core;

use std::io::{self, Write};
use futures::{Future, Stream};
use hyper::Client;
use tokio_core::reactor::Core;

fn main() {
    let mut core = Core::new().unwrap();
    let client = Client::new(&core.handle());

    let uri = "http://httpbin.org/ip".parse().unwrap();
    let work = client.post(uri).and_then(|res| {
        // if post changed to get it will work correctly
        println!("Response: {}", res.status());

        res.body("x=z")
            .for_each(|chunk| io::stdout().write_all(&chunk).map_err(From::from))
    });
    core.run(work).unwrap();
}

error:

error[E0599]: no method named `post` found for type `hyper::Client<hyper::client::HttpConnector>` in the current scope
  --> src/main.rs:15:23
   |
15 |     let work = client.post(uri).and_then(|res| {
   |                       ^^^^

error[E0277]: the trait bound `[u8]: std::marker::Sized` is not satisfied
  --> src/main.rs:20:24
   |
20 |             .for_each(|chunk| io::stdout().write_all(&chunk).map_err(From::from))
   |                        ^^^^^ `[u8]` does not have a constant size known at compile-time
   |
   = help: the trait `std::marker::Sized` is not implemented for `[u8]`
   = note: all local variables must have a statically known size

Solution

  • There's no secret trickery to the error message. You are getting the error "no method named post found for type hyper::Client" because there's no such method.

    If you review the documentation for Client, you can see all the methods it has. None of them are post.

    Instead, you need to use Client::request and pass in a Request value. The constructor for Request accepts a Method which denotes the HTTP method to use.

    use hyper::{Client, Request, Method};
    
    fn main() {
        // ...
    
        let uri = "http://httpbin.org/ip".parse().unwrap();
        let req = Request::new(Method::Post, uri);
    
        let work = client.request(req).and_then(|res| {
            // ...
        });
    }
    

    The crate documentation says:

    If just starting out, check out the Guides first.

    There is a guide for exactly your case: Advanced Client Usage.