AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77425593
Accepted
quilkin
quilkin
Asked: 2023-11-05 18:40:29 +0800 CST2023-11-05 18:40:29 +0800 CST 2023-11-05 18:40:29 +0800 CST

serviço web c# convertido para nó/express não funciona

  • 772

Eu tenho um cliente funcional escrito em TypeScript e um servidor web legado escrito em c# . Estou tentando converter o código c# em nós.js/express.

A função de busca do cliente:

export async function myFetch(url : String, data : Object | null)  {

    const bodyData = JSON.stringify(data);
    const options = {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: bodyData
    }
    const fullUrl = serviceBase() + url;
    let res;

    try {
      if (data==null)
        res = await fetch(fullUrl);
      else
        res = await fetch(fullUrl, options);

      if (!res.ok) {
        throw new Error(`HTTP error: ${res.status}`);
      }
      return await res.json();
    }

   catch (error : any) {
      AlertError('Web error',error)
    }
  
  }

e esta é a interface (em C#) para um dos endpoints do servidor:

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/GetRidesForDate", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
[ServiceKnownType(typeof(List<Ride>))]
IEnumerable<Ride> GetRidesForDate(int date);

Usando isso, GetRidesForDateretorna resultados corretos.

Na tentativa de nó/expresso eu tenho:

const app = express ();
const port = process.env.PORT || 3000;
app.use(express.json());
app.use(cors());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.listen(port, () => {
    console.log("Server Listening on PORT:", port);
  });
app.get("/GetRidesForDate/:date", (request: any, response: { json: (arg0: any[]) => void; }) =>
  {
    console.log('getRidesForDate '  + request.params.date);
    getRidesForDate(request,response);
  })

mas se eu ligar para o cliente buscar com

rides.value = await myFetch("GetRidesForDate",18800);

o código do servidor nunca chega console.log, em vez disso, recebo um erro:

SyntaxError: Unexpected token '1', "#" is not valid JSON
at JSON.parse (<anonymous>)

Este 1é o primeiro dígito dos dados de busca. O cliente apresenta um erro 400 (solicitação incorreta).

Se eu usar um navegador e for para http://localhost:3000/GetRidesForDate/18800o servidor node/express responde corretamente.

Quais devem ser os parâmetros app.get()para fazer isso funcionar com meu fetchcomando?

c#
  • 1 1 respostas
  • 53 Views

1 respostas

  • Voted
  1. Best Answer
    traynor
    2023-11-05T23:21:09+08:002023-11-05T23:21:09+08:00

    O problema é que o corpo de busca JSON.stringify(18800)não é um JSON válido e esse erro de análise vem do analisador de corpo JSON do servidor, daí o 400 Bad requesterro (não estou familiarizado com c #, então não tenho ideia de por que não há erro lá ..).

    Então, você precisa realmente usar um JSON válido:

    em vez disso:

    const bodyData = JSON.stringify(data);//18800: not valid JSON
    

    usa isto:

    const bodyData = JSON.stringify({data}); //{"data":18800}: valid JSON
    

    e então acesse-o no servidor via req.body.data.

    Além disso, não está claro como você lida com essa solicitação, porque no código de busca do cliente, você parece ter duas solicitações: uma GET e uma POST (que dá o erro), mas nenhuma delas deve funcionar, porque no servidor você tem apenas rota GET que espera :dateparâmetro, que você parece enviar apenas via corpo na solicitação POST.

    Então, por que não enviá-lo sempre via body e, se estiver indefinido, configurá-lo para algo padrão e processá-lo.

    E se você realmente deseja que essa rota funcione tanto com POST quanto com GET, então você pode usar app.use("/GetRidesForDate"...., mas parece não haver propósito para isso, e também, você precisaria adicionar :dateparâmetro na url, e não usar bodynada, o que é por isso que provavelmente é mais conveniente usar sempre req.body.

    Obs: você também pode remover o extra app.use(bodyParser.json());, pois você já usaapp.use(express.json());

    Experimente isto:

    cliente:

    export async function myFetch(url : String, data : Object | null)  {
    
        const bodyData = JSON.stringify({data});
        const options = {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: bodyData
        }
        const fullUrl = serviceBase() + url;
        let res;
    
        try {
            res = await fetch(fullUrl, options);
    
          if (!res.ok) {
            throw new Error(`HTTP error: ${res.status}`);
          }
          return await res.json();
        }
    
       catch (error : any) {
          AlertError('Web error',error)
        }
      
      }
    

    servidor:

    // to make both GET and POST work, you could use `app.use("/GetRidesForDate"....`, but there seems to be no purpose for that..
      app.post("/GetRidesForDate", (request: any, response: { json: (arg0: any[]) => void; }) =>
      {
        console.log('getRidesForDate ', request.body.data);
        // if no req.body.data, add some defaults..
        getRidesForDate(request,response);
      })
    
    • 3

relate perguntas

  • Polly DecorrelatedJitterBackoffV2 - como calcular o tempo máximo necessário para concluir todas as novas tentativas?

  • Wpf. Role o DataGrid dentro do ScrollViewer

  • A pontuação que ganhei na página do jogo com .NET MAUI MVVM não é visível em outras páginas. Como posso manter os dados de pontuação no dispositivo local

  • Use a hierarquia TreeView com HierarchicalDataTemplate de dentro de um DataTemplate

  • Como posso melhorar essa interface de validação no .NET?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve