質問編集履歴

1 初心者マークをつけた(つけ忘れてた)

tyu_ru_cpp

tyu_ru_cpp score 40

2019/04/28 21:22  投稿

プログラミングRust 2.5 簡単なWebサーバのコードが正しく動作しない
### 前提・実現したいこと
今まで積んでた「プログラミングRust」で学習中です
2.5 簡単なWebサーバのコードをコードを実行してみたのですが、ボタンを押しても動作しません
自分はWeb系の人ではないのでgetとかpostとかもよくわかってなく、どこが間違っているのかわからないので質問しました
### 該当のソースコード
```toml
[package]
name = "iron-gcd"
version = "0.1.0"
authors = [""]
[dependencies]
iron = "0.5.1"
mime = "0.2.3"
router = "0.5.1"
urlencoded = "0.5.0"
```
```rust
extern crate iron;
#[macro_use]
extern crate mime;
extern crate router;
use iron::prelude::*;
use iron::status;
use router::Router;
extern crate urlencoded;
use std::str::FromStr;
use urlencoded::UrlEncodedBody;
fn main() {
let mut router = Router::new();
router.get("/", get_from, "root");
router.post("/gcd", post_gcd, "gcd");
println!("Serving on http://localhost:3000...");
Iron::new(router).http("localhost:3000").unwrap();
}
fn get_from(_request: &mut Request) -> IronResult<Response> {
let mut response = Response::new();
response.set_mut(status::Ok);
response.set_mut(mime!(Text/Html; Charset=Utf8));
response.set_mut(
r#"
<title>GCD Calculator</title>
<from action="/gcd" method="post">
<input type="text" name ="n"/>
<input type="text" name ="n"/>
<button type="submit">Compute GCD</button>
</from>"#,
);
Ok(response)
}
fn post_gcd(request: &mut Request) -> IronResult<Response> {
let mut response = Response::new();
let from_data = match request.get_ref::<UrlEncodedBody>() {
Err(e) => {
response.set_mut(status::BadRequest);
response.set_mut(format!("Error parsing from data: {:?}\n", e));
return Ok(response);
}
Ok(map) => map,
};
let unparsed_numbers = match from_data.get("n") {
None => {
response.set_mut(status::BadRequest);
response.set_mut(format!("from data has no 'n' parameter"));
return Ok(response);
}
Some(nums) => nums,
};
let mut numbers = Vec::new();
for unparsed in unparsed_numbers {
match u64::from_str(&unparsed) {
Err(_) => {
response.set_mut(status::BadRequest);
response.set_mut(format!(
"Value for 'n' parameternot a number: {:?}\n",
unparsed
));
return Ok(response);
}
Ok(n) => {
numbers.push(n);
}
}
}
let mut d = numbers[0];
for m in &numbers[1..] {
d = gcd(d, *m);
}
response.set_mut(status::Ok);
response.set_mut(mime!(Text/Html; Charset=Utf8));
response.set_mut(format!(
"The gratest common divisor of the numbers {:?} is <b>{}</b>\n",
numbers,
d
));
Ok(response)
}
fn gcd(mut n: u64, mut m: u64) -> u64 {
assert!(n != 0 && m != 0);
while m != 0 {
if m < n {
let t = m;
m = n;
n = t;
}
m = m % n;
}
n
}
#[test]
fn test_gcd() {
assert_eq!(gcd(14, 15), 1);
assert_eq!(gcd(2 * 3 * 5 * 11 * 17, 3 * 7 * 11 * 13 * 19), 3 * 11);
}
```
### 試したこと
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)
よろしくおねがいします
  • Rust

    112 questions

    Rustとは、Mozilla(モジラ)製の実験的な並列かつマルチパラダイムのプログラミング言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る