@app.route("/send-url", methods=["POST"])
def test(id):
    try:
        data = request.json
        # this data should be used as a response for the session in call-back endpoint below
    except Exception as err:
        logger.exception(err)
        return jsonify({"message": False, "error": "Server Error"})


@app.route("/call-back", methods=["POST", "GET"])
def test2():
    try:
        payload = dict(sanitizerRequest(request))
        headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
        forward_url = "https://app.io/c/ex/d0839b26-1390-4542-a388-766cfdc1e1a4/receive" # to external service

        req = requests.post(forward_url, json.dumps(payload), headers=headers)
        status = req.status_code
        if status == 200:
            # The external service only acknowledges with status code here.
            # But it makes a POST on  http://localhost:5000/send-url and it is the values it POSTS that i wanna send as reply here
            response = ......
            #return response
        else:
            res_string =f"Error, we could not forward  {forward_url}. Status code {status}"
            #res_string ='Remote application down'
            return jsonify({"responseString":res_string, "action":"end"}), 200
    except Exception as err:
        res_string ="something went wrong"
        logger.exception(err)
        return jsonify({"responseString":res_string, "action":"end"}), 200

उपरोक्त कोड स्निपेट में, मेरे पास दो अंतिम बिंदु हैं, एक बाहरी सेवा A द्वारा कॉलबैक (http://domain.xxx/call-back) के रूप में उपयोग किया जाता है, जो इसे GET या POST अनुरोध करता है, मैं फिर अग्रेषित करता हूं जो url https://app.io/c/ex/d0839b26-1390-4542-a388-766cfdc1e1a4/receive के माध्यम से किसी अन्य बाहरी सेवा B के लिए सामग्री का अनुरोध करता है।

अब, बाहरी सेवा B केवल स्थिति कोड द्वारा प्रतिसाद देती है, लेकिन कुछ ही समय बाद, यह मेरे दूसरे अंतिम-बिंदु http://domain.xxx/send-url के लिए एक POST अनुरोध करती है, जिसकी मुझे पहली बाहरी सेवा की प्रतिक्रिया के रूप में आवश्यकता है .

तो, मेरा प्रश्न यह है कि, जब http://domain.xxx/call-back को कॉल किया गया था, तब शुरू हुए सत्र को छोड़े बिना मैं दूसरे समापन बिंदु की प्रतीक्षा कैसे करूं और सुनूं, ताकि मैं बाहरी सेवा A का उत्तर यहां पोस्ट किए गए डेटा के साथ दे सकूं http://domain.xxx/send-url

0
E.Keeya 14 सितंबर 2020, 16:18

1 उत्तर

सबसे बढ़िया उत्तर

मैंने वास्तव में इसे कुछ समय पहले समझ लिया था, मैंने test2 में स्टेटसकोड 200 प्राप्त करने के ठीक बाद एक अवरुद्ध पॉप बनाकर रेडिस सूची कुंजी का उपयोग किया था, फिर test1 पर दूसरा छोर अपने गणना परिणामों को इस सूची में धकेलता है, जैसे ही यह इसे धक्का देता है, अवरुद्ध पॉप एक मान वापस कर देगा।

मैंने हमेशा के लिए bpop से बचने के लिए कुछ टाइमिंग आउट भी जोड़ा।

r = redis.Redis(host='localhost', port=6379, db=0)
key2 = f"MSG_KEY_{some_unique_key}" # define a redis key hia

@app.route("/send-url", methods=["POST"])
def test(id):
    try:
        data = request.json
        # this data should be used as a response for the session in call-back endpoint below
        
        # do some proccesing 
        content  =  proccesing....

        r.lpush(key2, str(content)) # push to redis list
    except Exception as err:
        logger.exception(err)
        return jsonify({"message": False, "error": "Server Error"})


@app.route("/call-back", methods=["POST", "GET"])
def test2():
    try:
        payload = dict(sanitizerRequest(request))
        headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
        forward_url = "https://app.io/c/ex/d0839b26-1390-4542-a388-766cfdc1e1a4/receive" # to external service

        

        req = requests.post(forward_url, json.dumps(payload), headers=headers)
        status = req.status_code
        if status == 200:
            data = r.blpop(key2)  # do a blocking pop on the redis list
            response = data
            #return response
        else:
            res_string =f"Error, we could not forward  {forward_url}. Status code {status}"
            #res_string ='Remote application down'
            return jsonify({"responseString":res_string, "action":"end"}), 200
    except Exception as err:
        res_string ="something went wrong"
        logger.exception(err)
        return jsonify({"responseString":res_string, "action":"end"}), 200

0
E.Keeya 8 अक्टूबर 2020, 12:30