使用std在Rust中生成HTTP请求

Rus*_*ore 3 tcp http rust

我正在努力教自己Rust.我知道rust-http,但我想构建自己的http客户端.我正在使用GNU Linux 64位的当前每晚构建.

这是我目前的代码:

use std::io::net::ip::SocketAddr;
use std::io::net::tcp::TcpStream;
use std::io::net::addrinfo::get_host_addresses;
use std::io::net::ip::IpAddr;
use std::io::stdio::println;

fn main() {
  // HTTP endpoint
  let host = ~"www.telize.com";
  let path = ~"/geoip";

  // Attempt to convert host to IP address
  let ip_lookup = get_host_addresses(host).unwrap();

  // Open socket connection
  let addr = SocketAddr { ip: ip_lookup[0].clone(), port: port.clone() };
  let mut socket = TcpStream::connect_timeout(addr, 200u64).unwrap();

  // Format HTTP request
  let mut header = format!("GET {} HTTP/1.0\r\nHost: {}\r\n", path.clone(), host.clone());
  println(header);
  socket.write_str(header);

  // Make request and return response as string
  let resp = socket.read_to_str().unwrap();
  println(resp);
}
Run Code Online (Sandbox Code Playgroud)

这编译.但是,运行代码我通过套接字看到HTTP请求,但它只是在终端中挂起.此外,没有回应.在浏览器中测试此URL(http://www.telize.com/geoip)会返回JSON响应.如何使用Rust std库获得此响应(或任何响应)?谢谢!!

Chr*_*gan 5

您的请求格式不正确,因为您尚未完成标题,因此它正在等待您这样做.要结束标题,您需要一个空行.也就是说,您必须在Host头之后写一个额外的CRLF.

(顺便说一句,我看不到port任何地方.)