Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用POST请求更新Actix app_data?

如何使用POST请求更新Actix app_data?
EN

Stack Overflow用户
提问于 2021-05-29 17:31:22
回答 1查看 252关注 0票数 0

我正在尝试创建一个Actix服务器,我想使用它作为全局HashMap的接口。

我已经能够创建一个返回整个结构的路由。然而,现在我在更新HashMap时遇到了问题。我可以提交和接收POST请求,但是在尝试使用publish路由和get_topics路由之后,结果HashMap为空{}。

代码语言:javascript
运行
AI代码解释
复制
// Publish to topic (creating new topic if none of the same name exists, else update the data)
async fn publish_topic(
    topics: web::Data<Mutex<Map<String, Value>>>,
    body: web::Bytes,
) -> Result<HttpResponse, Error> {
    let result = serde_json::from_str(std::str::from_utf8(&body).unwrap());
    let publish_req: Info = match result {
        Ok(v) => v,
        Err(e) => Info {
            topic: "_".to_string(),
            data: json!(e.to_string()),
        },
    };
    println!("[ SERVER ]: POST Req: {:?}", publish_req);
    topics
        .lock()
        .unwrap()
        .insert(publish_req.topic, publish_req.data);
    let map = topics.lock().unwrap().clone();
    println!("\n\n{:?}\n\n", topics.lock().unwrap());
    let body = serde_json::to_string_pretty(&map).unwrap();
    return Ok(HttpResponse::Ok().json(body));
}

#[actix_web::main]
pub async fn start_server() {
    std::env::set_var("RUST_LOG", "actix_web=info");
    env_logger::init();

    let (tx, _) = mpsc::channel();

    thread::spawn(move || {
        let sys = System::new("http-server");

        let srv = HttpServer::new(move || {
            let topics: web::Data<Mutex<Map<String, Value>>> =
                web::Data::new(Mutex::new(Map::new()));

            App::new()
                .app_data(topics.clone()) // add shared state
                // enable logger
                .wrap(middleware::Logger::default())
                // register simple handler
                .service(web::resource("/").route(web::get().to(get_topics)))
                .service(web::resource("/publish").route(web::post().to(publish_topic)))
        })
        .bind("127.0.0.1:8080")?
        .run();

        let _ = tx.send(srv);
        sys.run()
    });
}
EN

回答 1

Stack Overflow用户

发布于 2021-05-31 11:19:36

嗯,你的问题源于你的方法。让我们看一下下面这行:

代码语言:javascript
运行
AI代码解释
复制
let srv = HttpServer::new(move || {
      let topics: web::Data<Mutex<Map<String, Value>>> =
          web::Data::new(Mutex::new(Map::new()));
          ...

由于actix-web使用application factory来创建新的http服务器,这将告诉它在每个线程中创建一个新的主题映射。我猜这不是你自己想要做的。要解决您的问题,您需要创建主题的实例,并为启动的所有线程创建clone。这将会起作用:

代码语言:javascript
运行
AI代码解释
复制
let topics: web::Data<Mutex<Map<String, Value>>> =
            web::Data::new(Mutex::new(Map::new()));

HttpServer::new(move || {
    App::new()
        .app_data(topics.clone())

这个answer也可以作为一个很好的参考。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67754144

复制
相关文章
HttpURLConnection 使用POST请求方式
HttpURLConnection 使用POST请求方式 new Thread(new Runnable() { @Override public void run() { intView(); } }).start(); } private void intView() { try { URL url =
八神太一
2021/04/05
3.6K0
python使用request发送post请求
唯一Chat
2023/09/15
2370
【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )
【OkHttp】OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) 【OkHttp】Android 项目导入 OkHttp ( 配置依赖 | 配置 networkSecurityConfig | 配置 ViewBinding | 代码示例 ) 【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )
韩曙亮
2023/03/29
16.6K0
使用requests模块post payload请求
import json import requests import datetime postUrl = 'https://sellercentral.amazon.com/fba/profita
hankleo
2020/09/17
1.6K0
GET请求和POST请求
在网络编程中,HTTP协议是最常用的协议之一,用于在客户端和服务器之间传输数据。HTTP协议中最常用的两种请求方式是GET和POST请求。这篇博客将介绍GET和POST请求的区别,以及在不同场景中如何选择使用这两种请求方式。
chao超的搬运文章
2023/10/15
5660
如何在Vue组件中使用代理发起POST请求?
在Vue组件中使用代理发起POST请求的方法与使用GET请求类似。 可以使用axios或其他HTTP库来发送POST请求,将请求路径设置为代理路径。
王小婷
2023/09/25
3910
-GET和POST请求添加请求参数和请求头【TBK使用】
我们平常浏览各个网站时,不免有时候就需要填写一些信息,比如注册时,登录时,这些信息一般都是通过GET请求或者POST(敏感信息一般使用POST,数据隐藏,相对来说更安全)请求提交到后台,经过后台的一系列处理,再返回给前台结果,前台进行处理。
凯哥Java
2019/06/28
6.5K0
原生js发送post请求_javascript发送post请求
说明: 要测试restsharp的功能,首先需要了解http传参和下载上传文件的原理,请参考: c#:从http请求报文看http协议中参数传递的几种方式 c#使用Http上传下载文件
全栈程序员站长
2022/10/04
8.6K0
原生js发送post请求_javascript发送post请求
php使用CURL模拟POST请求函数
本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn
仙士可
2019/12/19
2.5K0
使用scrapy发送post请求的坑
Requests 简便的 API 意味着所有 HTTP 请求类型都是显而易见的。例如,你可以这样发送一个 HTTP POST 请求:
小歪
2018/08/31
5.7K0
Volley使用JsonObjectRequest发送Post请求失败
这段时间一直在忙比赛,开发一个Android应用。转眼间博客竟然这么久没更新了,罪过罪过…这两天在用Volley框架,但是当我使用JsonObjectRequest发送Post请求时,竟然失效了。服务器一直响应失败,搞了半天,在StackOverFlow上找到了类似的问题,终于解决掉了。
零式的天空
2022/03/22
2.1K0
C++使用curl发送post请求
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157755.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/18
3.3K0
C++使用curl发送post请求
urlconnection post请求
package com.rayootech.activiti.util; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class Test { public static void main(String[] args) { String loadJSON =
挑战者
2018/11/09
2.1K0
python post请求
post请求只需构建一个Request对象,并把参数传递给Request对象的data属性即可(也可以在urlopen方法中传递给data参数)。
灯珑LoGin
2022/10/31
1.8K0
post请求包含哪些参数(请求方式post和get)
1)、HTTP 协议是以 ASCII 码 传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。 2)、协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须 使用什么编码方式 。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。 3)、数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。
全栈程序员站长
2022/07/29
3.8K0
resttemplate post请求发送body_java发送post请求
1POST传递参数 :采用 LinkedMultiValueMap ,不能使用HashMap
全栈程序员站长
2022/10/03
2.5K0
POST请求和GET请求如何传递和接收解析参数
接口参数应该怎么传递是每个项目应该面对的问题,这跟编程语言无关,今天来总结一波常用的接口参数传递方式。
码农小胖哥
2020/10/10
27K0
POST请求和GET请求如何传递和接收解析参数
【小家Java】Servlet规范之---请求(request):Servlet中如何获取POST请求参数?(使用getParameter())
request对象封装了来自客户端的所有请求信息。在HTTP协议中,客户端发给服务端的所有信息都是通过request对象的请求头和请求体来传送的。
YourBatman
2019/09/03
13.9K0
【小家Java】Servlet规范之---请求(request):Servlet中如何获取POST请求参数?(使用getParameter())
点击加载更多

相似问题

Actix不处理post请求吗?

10

使用actix从HTML页面捕获GET & POST请求

21

如何访问actix的app_data::check()函数?

15

如何将app_data()配置为actix_web()

16

如何使用Actix on Rust创建POST方法?

122
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文