当前位置:  开发笔记 > 后端 > 正文

是否可以使用Iron框架在路由器位置发布JSON文件?

如何解决《是否可以使用Iron框架在路由器位置发布JSON文件?》经验,为你挑选了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
{
    let document_url_encoded = req.extensions.get::()
                                             .unwrap()
                                             .find("json")
                                             .unwrap_or("/");
    // Just return Ok
    Ok(Response::with((status::Ok, "Ok")))
}

我想在document_url_encoded变量中包含JSON数据.(我猜它的命名很差,因为在这种情况下它不会是url/percent编码)



1> Shepmaster..:

您对HTTP POST的工作原理有误解,或者至少在通过Iron和朋友公开时它是如何工作的.POST请求在URL /路径信息的请求的单独部分中发送,Iron分别公开这两个概念.

您正在使用Iron Router将路径映射到函数并从路径中提取简单参数.您需要使用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 {
    match req.extensions.get::().and_then(|r| r.find("json")) {
        Some(name) => println!("The name was {:?}", name),
        None => println!("There was no name!"),
    }

    match req.get::() {
        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错误.

这是完成的

bodyparser 0.7.0

铁0.5.1

坐骑0.3.0

路由器0.5.1

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有