http - 使用 std 在 Rust 中发出 HTTP 请求

标签 http tcp 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);
}

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

最佳答案

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

(顺便说一句,我在任何地方都没有看到 port 定义。)

关于http - 使用 std 在 Rust 中发出 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23346757/

相关文章:

javascript - 如何使用 HTTP POST 请求将参数发送到 Iframe

java - IBM Watson Q and A API 给出 ​​500 响应代码

java - 桌面 TCP 流式传输 (java)

rust - cargo 单据中的下标和上标字符?

rust - 如何将 usize 转换为单个字符?

rust - 如何在克隆键的 HashMap 的键上返回迭代器?

Android 解析 HTTP POST 响应

php - CURLOPT_CONNECTTIMEOUT 不工作

c - listen() 积压上限

c# - 发送FIN包,通知数据已发送