是否可以使用 Iron 框架在路由器位置 post 一个 JSON 文件?
Is possible to post a JSON file at a router location with the Iron framework?
我在一个应用程序中使用 Iron web 框架(用于 Rust 编程语言),并且我在使用 Router crate 时有一个暴露给 POST JSON 数据的路径。
它有效,但我必须对我的 JSON 数据进行百分比编码,并将其作为字符串附加到我的 HTTP POST 请求的末尾 - 这有效但有点乏味,我会喜欢最终 POST 原始图像文件。
我希望能够按照以下 curl 命令执行某些操作:
curl -v -i --header "Content-Type: application/json" -X POST -d @some_local_json_file.json http://my_server_ip_address:3000/example_path/post/json_object_here
我目前收到 HTTP/1.1 404 Not Found
错误:
curl -v -i --header "Content-Type: application/json" -X POST -d @some_local_json_file.json http://my_server_ip_address:3000/example_path/post/json
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying my_server_ip_address...
* Connected to my_server_ip_address (my_server_ip_address) port 3000 (#0)
> POST /example_path/post/json HTTP/1.1
> Host: my_server_ip_address:3000
> User-Agent: curl/7.45.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 2354
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 404 Not Found
HTTP/1.1 404 Not Found
< Date: Mon, 28 Dec 2015 22:44:03 GMT
Date: Mon, 28 Dec 2015 22:44:03 GMT
< Content-Length: 0
Content-Length: 0
<
* Connection #0 to host my_server_ip_address left intact
我的 main
函数的内容如下:
fn main() {
// create the router
let mut router = Router::new();
router.post("/example_path/post/:json", post_to_documents);
let mut mount = Mount::new();
// mount the router
mount.mount("/", router);
Iron::new(mount).http("0.0.0.0:3000").unwrap();
}
而上面列出的 post_to_documents
是这样的:
fn post_to_documents(req: &mut Request) -> IronResult<Response>
{
let document_url_encoded = req.extensions.get::<Router>()
.unwrap()
.find("json")
.unwrap_or("/");
// Just return Ok
Ok(Response::with((status::Ok, "Ok")))
}
我想在 document_url_encoded
变量中包含 JSON 数据。 (我猜它的名字不好,因为在这种情况下它不会被 url/percent 编码)
您对 HTTP POST 的工作方式有误解,或者至少在通过 Iron 和朋友公开时它是如何工作的。 POST 请求是在与 URL / 路径信息分开的请求部分中发送的,Iron 分别公开了这两个概念。
您正在使用 Iron Router to map paths to functions and to extract simple parameters from the path. You need to also use Iron Body Parser 从 POST 正文中提取数据。它会自动为您解析 JSON,并提供对原始二进制数据的访问权限。
extern crate iron;
extern crate router;
extern crate mount;
extern crate bodyparser;
use iron::prelude::*;
use iron::status;
use router::Router;
use mount::Mount;
fn post_to_documents(req: &mut Request) -> IronResult<Response> {
match req.extensions.get::<Router>().and_then(|r| r.find("json")) {
Some(name) => println!("The name was {:?}", name),
None => println!("There was no name!"),
}
match req.get::<bodyparser::Json>() {
Ok(Some(json_body)) => println!("Parsed body:\n{:?}", json_body),
Ok(None) => println!("No body"),
Err(err) => println!("Error: {:?}", err)
}
Ok(Response::with((status::Ok, "Ok")))
}
fn main() {
let mut router = Router::new();
router.post("/documents/post/:json", post_to_documents, "new_document");
let mut mount = Mount::new();
mount.mount("/", router);
Iron::new(mount).http("0.0.0.0:3000").unwrap();
}
我有一个名为 input.json
的文件:
{"key": "value"}
我运行这个命令:
curl -v -i --header "Content-Type: application/json" -X POST -d @input.json http://127.0.0.1:3000/documents/post/awesome
使用服务器的输出:
The name was "awesome"
Parsed body:
Object({"key": String("value")})
我无法解释您收到 404 错误的原因。
这是用
完成的
- 正文解析器 0.7.0
- 铁 0.5.1
- 挂载 0.3.0
- 路由器 0.5.1
我在一个应用程序中使用 Iron web 框架(用于 Rust 编程语言),并且我在使用 Router crate 时有一个暴露给 POST JSON 数据的路径。
它有效,但我必须对我的 JSON 数据进行百分比编码,并将其作为字符串附加到我的 HTTP POST 请求的末尾 - 这有效但有点乏味,我会喜欢最终 POST 原始图像文件。
我希望能够按照以下 curl 命令执行某些操作:
curl -v -i --header "Content-Type: application/json" -X POST -d @some_local_json_file.json http://my_server_ip_address:3000/example_path/post/json_object_here
我目前收到 HTTP/1.1 404 Not Found
错误:
curl -v -i --header "Content-Type: application/json" -X POST -d @some_local_json_file.json http://my_server_ip_address:3000/example_path/post/json
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying my_server_ip_address...
* Connected to my_server_ip_address (my_server_ip_address) port 3000 (#0)
> POST /example_path/post/json HTTP/1.1
> Host: my_server_ip_address:3000
> User-Agent: curl/7.45.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 2354
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 404 Not Found
HTTP/1.1 404 Not Found
< Date: Mon, 28 Dec 2015 22:44:03 GMT
Date: Mon, 28 Dec 2015 22:44:03 GMT
< Content-Length: 0
Content-Length: 0
<
* Connection #0 to host my_server_ip_address left intact
我的 main
函数的内容如下:
fn main() {
// create the router
let mut router = Router::new();
router.post("/example_path/post/:json", post_to_documents);
let mut mount = Mount::new();
// mount the router
mount.mount("/", router);
Iron::new(mount).http("0.0.0.0:3000").unwrap();
}
而上面列出的 post_to_documents
是这样的:
fn post_to_documents(req: &mut Request) -> IronResult<Response>
{
let document_url_encoded = req.extensions.get::<Router>()
.unwrap()
.find("json")
.unwrap_or("/");
// Just return Ok
Ok(Response::with((status::Ok, "Ok")))
}
我想在 document_url_encoded
变量中包含 JSON 数据。 (我猜它的名字不好,因为在这种情况下它不会被 url/percent 编码)
您对 HTTP POST 的工作方式有误解,或者至少在通过 Iron 和朋友公开时它是如何工作的。 POST 请求是在与 URL / 路径信息分开的请求部分中发送的,Iron 分别公开了这两个概念。
您正在使用 Iron Router to map paths to functions and to extract simple parameters from the path. You need to also use Iron Body Parser 从 POST 正文中提取数据。它会自动为您解析 JSON,并提供对原始二进制数据的访问权限。
extern crate iron;
extern crate router;
extern crate mount;
extern crate bodyparser;
use iron::prelude::*;
use iron::status;
use router::Router;
use mount::Mount;
fn post_to_documents(req: &mut Request) -> IronResult<Response> {
match req.extensions.get::<Router>().and_then(|r| r.find("json")) {
Some(name) => println!("The name was {:?}", name),
None => println!("There was no name!"),
}
match req.get::<bodyparser::Json>() {
Ok(Some(json_body)) => println!("Parsed body:\n{:?}", json_body),
Ok(None) => println!("No body"),
Err(err) => println!("Error: {:?}", err)
}
Ok(Response::with((status::Ok, "Ok")))
}
fn main() {
let mut router = Router::new();
router.post("/documents/post/:json", post_to_documents, "new_document");
let mut mount = Mount::new();
mount.mount("/", router);
Iron::new(mount).http("0.0.0.0:3000").unwrap();
}
我有一个名为 input.json
的文件:
{"key": "value"}
我运行这个命令:
curl -v -i --header "Content-Type: application/json" -X POST -d @input.json http://127.0.0.1:3000/documents/post/awesome
使用服务器的输出:
The name was "awesome"
Parsed body:
Object({"key": String("value")})
我无法解释您收到 404 错误的原因。
这是用
完成的- 正文解析器 0.7.0
- 铁 0.5.1
- 挂载 0.3.0
- 路由器 0.5.1