Tengo una API de node.js como la siguiente a la que envío una solicitud POST desde python como se muestra a continuación, el problema que enfrento es si elimino el headers={"Content-Type": "application/json"} la POST se torna fuerte, si no obtengo un Read timed out. error, ¿alguien puede proporcionar orientación sobre cómo solucionar este error de tiempo de espera?

punto final node.js

app.post("/api/bats_push",(req, res) => {
        //console.log("Calling bats_push...")
        const d = {
            method: req.method,
            headers: req.headers,
            query: req.query,
            body: ''
        }

        req.on('data', (c) => {
            //console.log(c)
            d.body = d.body + c
        });

        req.on('end', () => {
            DATA.push(d);
            res.end('Saved BATS job details');
            //res.status(200).json({
              //message: "Saved BATS job details",
              //posts: req.body
          //}); 
        });
});

POST de Python

try:
json"},timeout=10.0)
    r = requests.post(webhook_url,data=json_data.encode("utf8"),verify=False,headers={"Content-Type": "application/json"})
    print "posted"
    print(r.status_code, r.reason)
    print r.url
    print r.text
except Exception as e:
    print (e)

Error:-

  InsecureRequestWarning)
HTTPSConnectionPool(host='company.com', port=443): Read timed out. (read timeout=10.0)
6
Ritz 10 oct. 2019 a las 02:18

4 respuestas

La mejor respuesta

Parece que estás usando express.js. Creo que su problema es que ese cuerpo ya está analizado. Puede verificarlo leyendo req.body. La situación se debe a que express.js ya ha leído todo el cuerpo (debido al tipo de contenido) e intentar leerlo nuevamente provocará un tiempo de espera (no se emiten el evento data y el evento end). Hay varias formas de solucionarlo.

  1. deshabilite el analizador del cuerpo express.js, o reconfigure para ignorar json

  2. eliminar el código del cuerpo de lectura y usarlo directamente req.body

app.post("/api/bats_push",(req, res) => {
        //console.log("Calling bats_push...")
        const d = {
            method: req.method,
            headers: req.headers,
            query: req.query,
            body: req.body
        }

        DATA.push(d);
        res.end('Saved BATS job details');
});

1
Tomas 19 oct. 2019 a las 10:53

De acuerdo con las solicitudes, ¿por qué no usar esto?

#replace this 
r = requests.post(webhook_url,data=json_data.encode("utf8"),verify=False,headers={"Content-Type": "application/json"})

#by this...assuming that 'data' is a dict
r = requests.post(webhook, json=data, verify=False)
0
user1438644 10 oct. 2019 a las 00:35

De su pregunta, la palabra clave es:

Si elimino los encabezados = {"Content-Type": "application / json"}, la POST pasa.

La razón puede aclararse: es una forma incorrecta de usar el encabezado.

Más simple decir: la aplicación node.js verifica el encabezado antes en el código lógico.

Si no envía el encabezado por nosotros mismos, la parte de solicitudes usa los encabezados predeterminados a continuación:

{
  'User-Agent': 'python-requests/2.22.0', 
  'Accept-Encoding': 'gzip, deflate', 
  'Accept': '*/*', 
  'Connection': 'keep-alive', 
}

A través del código de las solicitudes puede imprimir los encabezados predeterminados cuando se publican.

Solo usas el encabezado

{"Content-Type": "application/json"}

Puede resultar en que la aplicación node.js piense que la solicitud no es legítima (la palabra que no sé cómo explicar en inglés).

Si usted mismo desarrolla la aplicación node.js, puede intentar encontrar la comprobación del marco después de crear una conexión tcp y antes del código lógico, la forma es leer el código fuente.

Si la aplicación node.js no ha sido desarrollada por usted mismo, intente cambiar el encabezado mezclando el encabezado predeterminado para encontrar la clave de encabezado que verificó la aplicación node.js.

Pero en mi opinión, es importante, sobre la descripción de la interfaz de la aplicación node.js:

Solo usamos por descripción de interfaz engouth, solo necesitamos saber el error de la verificación del encabezado de la API, que la descripción debe mostrar pero no mostrarnos.

Espero poder ayudarte.

0
LanHao 15 oct. 2019 a las 04:10

Parece que podría ser algo relacionado con su SSL. Compruebe si obtiene el mismo error al enviar una solicitud a su host local con el servidor en ejecución.

0
Hobey823 13 oct. 2019 a las 20:35
58313447