codervince
codervince

Reputation: 425

Forwarding a request to another API in Python (Rust) Robyn

I am using FastAPI to take in a JSON file which will then be the body of an API request out.. Orwell and Good so far. Now I want to apply the same but with robyn built on rust, instead of FastAPI. Not managed to get any joy with calling the API here at the point marked ??.

What things do I need to consider (documentation is sparse). Does robyn cut it alone, or am I missing something?


from robyn import Robyn, jsonify

app = Robyn(__file__)

@app.post("/yt")
async def json(request):
    body = request["body"]
    outurl = "https://translate.otherapi.com/translate/v1/translate"
    headers = {
            "Content-Type": "application/json",
            "Authorization": "Bearer {0}".format(TOKEN)
        }
    ?? response_data = await call_api(data)
    return response_data['translations'][0]


app.start(port=5000)

With FastAPI:

import aiohttp
import aiofiles
import json
import requests 
from fastapi import FastAPI, Header, Depends, HTTPException, Request

app = FastAPI()

async def call_api(data):
    async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False)) as session:
        async with session.post(url, headers=headers, json=data) as resp:
            response_data = await resp.json()
    return response_data

@app.post("/yt")
async def root(request:Request):
    data = await request.json()
    file_path = "data.json"
    await write_json_to_file(data, file_path)
    data = await read_json_from_file(file_path)
    response_data = await call_api(data)
    return response_data['translations'][0]

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8001)

Upvotes: 2

Views: 414

Answers (1)

Sanskar Jethi
Sanskar Jethi

Reputation: 636

The author of Robyn here. I am unable to understand what you are trying to achieve here. However, there is one issue, request["body"] returns a byte string array at the moment.

You need to alter your code to this:

import json
@app.post("/yt")
async def json(request):
    body = bytearray(request["body"]).decode("utf-8")
    data = json.loads(body)
    outurl = "https://translate.otherapi.com/translate/v1/translate"
    headers = {
            "Content-Type": "application/json",
            "Authorization": "Bearer {0}".format(TOKEN)
        }
    response_data = await call_api(data)
    return response_data['translations'][0]

This is peculiarity that I am not very fond of. We are hoping to fix this within the next few releases.

I hope this helped :D

Upvotes: 1

Related Questions