我正在使用铁。大多数时候像 99.* % 都很好。但有时我会收到错误,例如 Error is: ErrorImpl { code: EofWhileParsingString/List/Object, line: 1, column: 8186 } 或 InvalidUnicodeCodePoint。我正在日志中打印请求,当我尝试该请求时,一切都很顺利。我也有用 Golang 编写的服务器接收相同的请求,他们从来没有解析或 json 到 MyStruct 的转换问题。请注意,代码不会按原样编译,缺少导入、error::from 和结构定义。无法提供可重现的请求日志,因为它仅在为并发请求提供大量服务时发生,但如果接受单个请求,它工作正常。 我试过 serde_json::from_reader、bodyparser crate 并且都有同样的问题。
extern crate serde;
extern crate serde_json;
extern crate iron;
use self::iron;
use self::iron::prelude::*;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct MyStruct {
}
struct ResponseTime;
impl typemap::Key for ResponseTime {
type Value = u64;
}
#[derive(Debug)]
struct RequestBody;
impl typemap::Key for RequestBody {
type Value = RefCell<Vec<u8>>;
}
impl BeforeMiddleware for ResponseTime {
fn before(&self, req: &mut Request) -> IronResult<()> {
req.extensions.insert::<RequestBody>(RefCell::new(Vec::new()));
req.extensions.insert::<ResponseTime>(precise_time_ns());
Ok(())
}
}
impl AfterMiddleware for ResponseTime {
fn after(&self, req: &mut Request, res: Response) -> IronResult<Response> {
Ok(res)
}
fn catch(&self, req : &mut Request, err : IronError) -> IronResult<Response> {
let ref byte_req = *req.extensions.get::<RequestBody>()
.unwrap()
.borrow();
//just to make sure uft8 is not causing some issue.
let payload = unsafe {
str::from_utf8_unchecked(&byte_req)
};
//but when i send request body all comes good
error!("Error {} for Body {}", err, payload);
Err(err)
}
}
fn iron_handler(req : &mut Request) -> Result<Response, CustomError>{
let mut buffer = req.extensions.get::<server::RequestBody>()
.unwrap()
.borrow_mut();
req.body.read_to_end(&mut buffer)?;
// not seeing InvalidUnicodeCodePoint after this.
let payload = String::from_utf8_lossy(&buffer);
//some request throw error
let my_struct_obj : MyStruct = serde_json::from_str(&payload)?;
Ok(Response::with((iron::status::Ok, "Final Response")))
}
需要帮助来确定如何识别问题。在这里发帖的目的是看看是否有人有同样的问题,或者可以看到明显的问题。感谢大家的时间不要期望构建和运行示例,因为由于隐私而无法提供它们。