我试图自学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);
}
这个编译。但是,运行代码我通过套接字看到HTTP请求,但它只是在终端中挂起。此外,没有回应。在浏览器中测试此URL(http://www.telize.com/geoip)会返回JSON响应。如何使用Rust std库获得此响应(或任何响应)?谢谢!
答案 0 :(得分:5)
您的请求格式不正确,因为您尚未结束标题,因此它正在等待您这样做。要结束标题,您需要一个空行。也就是说,您必须在Host标头之后写一个额外的CRLF。
(顺便说一句,我不会在任何地方看到port
。)
答案 1 :(得分:2)
看起来每个人都想构建自己的HTTP客户端而无需阅读文档。请查看RFC2616并特别注意HTTP标头和正文之间的分隔符(即使没有正文)。