Como realizar peticion post a una api con ssl desde python

300 views
Skip to first unread message

hack.m...@gmail.com

unread,
Apr 22, 2021, 10:51:46 PM4/22/21
to odoo-ar...@googlegroups.com

Resulta que estoy intentando realizar la conexion a una api que posee autenticacion basica por lo que necesito enviar usuario y contraseña, la url es con https, y aunque he probado varias opciones, siempre recibo el mismo error. La peticion la estoy realizando con python desde odoo. Decir ademas que he probado la conexion desde postman y funciona perfectamente.

La peticion la realizo de la siguiente forma:

headers = {'charset': 'UTF-8', 'Content-Type': 'text/xml'}
response = requests.post(url, headers=headers, auth=(username, password), data=unescape(etree.tostring(generateXML.create_xml(data)).decode()), verify=False)

Error recibido: requests.exceptions.SSLError: HTTPSConnectionPool(host='url_host', port=443): Max retries exceeded with url: /preregistroenvios?wsdl (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_ske_dhe', 'dh key too small')])")))

Podrian ayudarme a solucionar este error?

Martin Llanos

unread,
Apr 23, 2021, 1:04:58 AM4/23/21
to odoo-ar...@googlegroups.com
Hola, con esta porcion de codigo tienes que poder conectarte a la tu api ingresando el end point y el token

Saludos.

# -*- coding: utf-8 -*-

from odoo import models, fields, api
import requests
import datetime
from datetime import datetime
from datetime import date
from datetime import timedelta
import logging
from odoo.exceptions import ValidationError, UserError
import json
from odoo.http import request
_logger = logging.getLogger(__name__)

    @api.model
    def callApi(self):

        url = request.env["ir.config_parameter"].sudo().get_param("product_endPoint")+date_web
        # product_endPoint es una variable en parametros de sistema que contiene la url del endpoint
        # user_key es una variable en los parametros de sistema que contiene el token de la api.
        cabecera = {    "user_key":request.env["ir.config_parameter"].sudo().get_param("user_key"),
                        "Content-Type":"application/json"
                    }

        resp = requests.get(url, headers=cabecera)

        if resp.status_code == 200:
            data = json.loads(resp.text)
            self.updateProduct(data, date_web)
        elif resp.status_code == 400:
            #toDo agregar al logger que la respuesta fue 400
            print('no hay nada que mostrar')
            pass
        else:
            pass
        # updateProduct es una funcion que tiene que contener el beam o logica de negocio que tengo que aplicar en mi api.

 Martín Llanos
 martin...@gmail.com    


--
Recuerda siempre poner la mayor cantidad de datos para que se entienda bien que necesitas y que respondes. Algunos errores comunes:
 
- Siempre mencionar en que versión de odoo trabajas.
- Siempre mencionar si el servidor esta en LINUX o en windows y en que versión.
- No alcanza con colocar el debug del error, debes indicar que necesitas que haga el código.
- Comparte tu código en un servidor abierto como Github, Launchpad u otro.
- Si haces un manual, tutorial o algo de interés comunal, trata de usar google docs.
 
Tu tiempo es tan valioso como el de cualquiera de la comunidad. Aquí se valora el aporte que hagas. Cuanto mas ayudes mas ayuda recibirás.
 
Nuestras normas mínimas de convivencia puede leerlas en https://groups.google.com/d/forum/odoo-argentina?hl=es-ES
---
Has recibido este mensaje porque estás suscrito al grupo "odoo-Argentina - Preguntas y respuestas para personalizadores" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a odoo-argentin...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/odoo-argentina/64db4007-5e91-1282-8714-a08f66be582c%40gmail.com.
Reply all
Reply to author
Forward
0 new messages