400 (Bad Request)

I'm trying to test client requests and server responses for an operation that will set some data to a database. The server responds with a 400 saying there's something wrong with the fetch request.

This is the server-side code in rust, there's nothing wrong here but it's still useful for reference.

mod database;
use actix_files as fs;
use actix_web::{App, HttpResponse, HttpServer, Responder, web};
use serde::Deserialize;

#[derive(Deserialize)]
struct Info
{
    operation: String,
    key: String,
    field: String,
    value: String
}

async fn index(info: web::Json<Info>) -> impl Responder
{
    let info = info.into_inner();
    if info.operation == "set".to_string()
    {
        database::set(info.key, info.value).ok();
        HttpResponse::Ok().body("Success!")
    }
    else if info.operation == "get".to_string()
    {
        let data = (database::get(info.key).ok()).unwrap();
        HttpResponse::Ok().body(data)
    }
    else if info.operation == "hset".to_string()
    {
        database::hset(info.key, info.field, info.value).ok();
        HttpResponse::Ok().body("Success!")
    }
    else if info.operation == "hget".to_string()
    {
        let data = database::hget(info.key, info.field).ok().unwrap();
        HttpResponse::Ok().body(data)
    }
    else
    {
        HttpResponse::Ok().body("Unknown Operation")
    }
}

#[actix_rt::main]
async fn main() -> std::io::Result<()>
{
    HttpServer::new(||
    {
        App::new()
        .route("/", web::post().to(index))
        .service(fs::Files::new("/", "./main_page").show_files_listing().index_file("index.html"))
    })
    .bind("127.0.0.1:8088")?
    .run()
    .await
}

And this is my client-side javascript call:

main();

async function main()
{
    set("value", "42");
}

async function set(key, value)
{
    const data = 
    {
        "operation": "set",
        "key": key,
        "field": "null",
        "value": value
    };
    const options = 
    {
        method:'POST',
        headers:
        {
            'Content-Type': 'application/json'
        },
        body: data
    };
    fetch("http://localhost:8088/", options);
    return "Success!";
}

Did I do something wrong in data or options? Thanks for the future help.

Cant help with actix but a general suggestion.
Run wireshark to see raw transfer.

You may need to set the body to JSON.stringify(data) instead of just data.

Thanks it worked!

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.