Search code examples
pythonfunctionibm-cloudcloudant

Response is not valid 'application/json'


I have an issue with my post request. This is my code:

def add_review(request, dealer_id):
    if request.method == "GET":
        context = {
            "cars": CarModel.objects.all().filter(dealerId = dealer_id),
            "dealerId": dealer_id
        }
        return render(request, 'djangoapp/add_review.html', context)
    if request.method == "POST":
        if request.user.is_authenticated:
            form = request.POST
            review = {                
                "dealership": int(dealer_id),
                "name": request.user.username,
                "review": form["review"],
                "purchase": form.get("purchasecheck") == 'on',
                }
            if form.get("purchasecheck"):
                review["purchase_date"] = datetime.strptime(form.get("purchasedate"), "%m/%d/%Y").isoformat()
                car = CarModel.objects.get(pk=form["car"])
                review["car_make"] = car.make.name
                review["car_model"] = car.name
                review["car_year"]= int(car.year.strftime("%Y"))
            json_payload = {"review": review}
            url = "https://4fbfebf7.us-south.apigw.appdomain.cloud/api/review"
            post_request(url=url, json_payload=json_payload, dealer_id=dealer_id)
            return redirect("djangoapp:dealer_details", dealer_id=dealer_id)
        else:
            return redirect("/djangoapp/login")

And this:

def post_request(url, json_payload, **kwargs):
    json_data = json.dumps(json_payload, indent=4)
    print(f"{json_data}")
    try:
        # Call get method of requests library with URL and parameters
        response = requests.post(url, params=kwargs, json=json_data)
    except Exception as e:
        # If any error occurs
        print("Network exception occurred")
        print(f"Exception: {e}")
    print(f"With status {response.status_code}")
    print(f"Response: {response.text}")

I am receiving Response is not valid 'application/json' error as you can see here.

Meanwhile, when I copy the exact same JSON to IBM Cloud to test my APIs, all is working fine and the record is created as you can see here.

I guess it's a very silly mistake, but where?


Solution

  • When you pass json to request.post it should be a serializable object (not already serialized)

    def post_request(url, json_payload, **kwargs):
        # json_data = json.dumps(json_payload, indent=4). << delete
        print(f"{json_payload}")
        try:
            # Call get method of requests library with URL and parameters
            response = requests.post(url, params=kwargs, json=json_payload)
        except Exception as e:
            # If any error occurs
            print("Network exception occurred")
            print(f"Exception: {e}")
        print(f"With status {response.status_code}")
        print(f"Response: {response.text}")