前提・実現したいこと
今まで積んでた「プログラミングRust」で学習中です
2.5 簡単なWebサーバのコードをコードを実行してみたのですが、ボタンを押しても動作しません
自分はWeb系の人ではないのでgetとかpostとかもよくわかってなく、どこが間違っているのかわからないので質問しました
該当のソースコード
toml
1[package] 2name = "iron-gcd" 3version = "0.1.0" 4authors = [""] 5 6[dependencies] 7iron = "0.5.1" 8mime = "0.2.3" 9router = "0.5.1" 10urlencoded = "0.5.0"
rust
1extern crate iron; 2#[macro_use] 3extern crate mime; 4extern crate router; 5 6use iron::prelude::*; 7use iron::status; 8use router::Router; 9 10extern crate urlencoded; 11 12use std::str::FromStr; 13use urlencoded::UrlEncodedBody; 14 15fn main() { 16 let mut router = Router::new(); 17 18 router.get("/", get_from, "root"); 19 router.post("/gcd", post_gcd, "gcd"); 20 21 println!("Serving on http://localhost:3000..."); 22 Iron::new(router).http("localhost:3000").unwrap(); 23} 24 25fn get_from(_request: &mut Request) -> IronResult<Response> { 26 let mut response = Response::new(); 27 28 response.set_mut(status::Ok); 29 response.set_mut(mime!(Text/Html; Charset=Utf8)); 30 response.set_mut( 31 r#" 32 <title>GCD Calculator</title> 33 <from action="/gcd" method="post"> 34 <input type="text" name ="n"/> 35 <input type="text" name ="n"/> 36 <button type="submit">Compute GCD</button> 37 </from>"#, 38 ); 39 40 Ok(response) 41} 42 43fn post_gcd(request: &mut Request) -> IronResult<Response> { 44 let mut response = Response::new(); 45 46 let from_data = match request.get_ref::<UrlEncodedBody>() { 47 Err(e) => { 48 response.set_mut(status::BadRequest); 49 response.set_mut(format!("Error parsing from data: {:?}\n", e)); 50 return Ok(response); 51 } 52 Ok(map) => map, 53 }; 54 55 let unparsed_numbers = match from_data.get("n") { 56 None => { 57 response.set_mut(status::BadRequest); 58 response.set_mut(format!("from data has no 'n' parameter")); 59 return Ok(response); 60 } 61 Some(nums) => nums, 62 }; 63 64 let mut numbers = Vec::new(); 65 for unparsed in unparsed_numbers { 66 match u64::from_str(&unparsed) { 67 Err(_) => { 68 response.set_mut(status::BadRequest); 69 response.set_mut(format!( 70 "Value for 'n' parameternot a number: {:?}\n", 71 unparsed 72 )); 73 return Ok(response); 74 } 75 Ok(n) => { 76 numbers.push(n); 77 } 78 } 79 } 80 let mut d = numbers[0]; 81 for m in &numbers[1..] { 82 d = gcd(d, *m); 83 } 84 85 response.set_mut(status::Ok); 86 response.set_mut(mime!(Text/Html; Charset=Utf8)); 87 response.set_mut(format!( 88 "The gratest common divisor of the numbers {:?} is <b>{}</b>\n", 89 numbers, 90 d 91 )); 92 Ok(response) 93} 94 95fn gcd(mut n: u64, mut m: u64) -> u64 { 96 assert!(n != 0 && m != 0); 97 while m != 0 { 98 if m < n { 99 let t = m; 100 m = n; 101 n = t; 102 } 103 m = m % n; 104 } 105 n 106} 107 108#[test] 109fn test_gcd() { 110 assert_eq!(gcd(14, 15), 1); 111 assert_eq!(gcd(2 * 3 * 5 * 11 * 17, 3 * 7 * 11 * 13 * 19), 3 * 11); 112 113}
試したこと
localhost:3000/gcdにはアクセスできませんでした。
補足情報(FW/ツールのバージョンなど)
cargo 0.23.0 (61fa02415 2017-11-22)
rustc 1.22.1 (05e2e1c41 2017-11-22)
rustdoc 1.22.1 (05e2e1c41 2017-11-22)
よろしくおねがいします
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/28 12:58 編集