0

What is the correct way to url encode the following so that I can POST it?

{    "data":[
      {
         "item_price_id":"477ABC8E-510F-4412-8F67-B1E2B9EDDC5E",
         "item_name":"כרטיס לסרט בסינמה סיטי למימוש בימי חמישי בלבד",
         "benefit_full_price":30,
         "benefit_discount_price":9,
         "benefit_vip_full_price":0,
         "benefit_vip_discount_price":0,
         "item_use_credit":1,
         "user_level_type":0,
         "member_type_name":"",
         "item_show_id":"3E3FD8CF-3D28-47D7-BEE3-C08AA8474F95",
         "item_hall_id":"null",
         "item_hall_name":"null",
         "item_show_date":"null",
         "item_show_time":"null",
         "item_is_limit":0,
         "item_limit":0,
         "limit":100000000000,
         "user_level":0,
         "user_limit":0,
         "show_limit":100000000000,
         "is_user":""
      }    ] }

This is how it's suppose to look like when posting:

data=%5B%7B%22item_price_id%22%3A%22477ABC8E-510F-4412-8F67-B1E2B9EDDC5E%22%2C%22item_name%22%3A%22%D7%9B%D7%A8%D7%98%D7%99%D7%A1+%D7%9C%D7%A1%D7%A8%D7%98+%D7%91%D7%A1%D7%99%D7%A0%D7%9E%D7%94+%D7%A1%D7%99%D7%98%D7%99+%D7%9C%D7%9E%D7%99%D7%9E%D7%95%D7%A9+%D7%91%D7%99%D7%9E%D7%99+%D7%97%D7%9E%D7%99%D7%A9%D7%99+%D7%91%D7%9C%D7%91%D7%93%22%2C%22benefit_full_price%22%3A30%2C%22benefit_discount_price%22%3A9%2C%22benefit_vip_full_price%22%3A0%2C%22benefit_vip_discount_price%22%3A0%2C%22item_use_credit%22%3A1%2C%22user_level_type%22%3A0%2C%22member_type_name%22%3A%22%22%2C%22item_show_id%22%3A%223E3FD8CF-3D28-47D7-BEE3-C08AA8474F95%22%2C%22item_hall_id%22%3Anull%2C%22item_hall_name%22%3Anull%2C%22item_show_date%22%3Anull%2C%22item_show_time%22%3Anull%2C%22item_is_limit%22%3A0%2C%22item_limit%22%3A0%2C%22limit%22%3A100000000000%2C%22user_level%22%3A0%2C%22user_limit%22%3A0%2C%22show_limit%22%3A100000000000%2C%22is_user%22%3A%22%22%7D%5D

I've tried using Requests data=json,json=json.dumps(json) but it's as if nothing gets encoded, see following output:

data=item_price_id&data=item_name&data=benefit_full_price&data=benefit_discount_price&data=benefit_vip_full_price&data=benefit_vip_discount_price&data=item_use_credit&data=user_level_type&data=item_show_time&data=item_is_limit&data=item_limit&data=limit&data=user_level&data=user_limit&data=show_limit&data=is_user

JustAGuy
  • 5,151
  • 11
  • 41
  • 55

2 Answers2

0

Combine json.dumps with urllib.parse.quote:

import json
import urllib.parse

data_s = json.dumps(data)
data_s_enc = urllib.parse.quote(data_s)

https://docs.python.org/3/library/urllib.parse.html#url-quoting

Tzane
  • 2,752
  • 1
  • 10
  • 21
  • The problem with this approach is that Requests performs another encoding ontop of the one already done by urllib. This skews the results. – JustAGuy Oct 07 '21 at 07:39
0

I got it eventually:

I needed to do a little deconstruction as urllib's encoding which is used by requests does not play well with arrays. This got me the result I was looking for.

sessionjson_arr = [{
      "item_price_id":website_response_json['benefits'][0]['benefits_items'][0]['item_price_id'],
      "item_name":website_response_json['benefits'][0]['benefits_items'][0]['item_name'],
      "benefit_full_price":website_response_json['benefits'][0]['benefits_items'][0]['benefit_full_price'],
      "benefit_discount_price":website_response_json['benefits'][0]['benefits_items'][0]['benefit_discount_price'],
      "benefit_vip_full_price":website_response_json['benefits'][0]['benefits_items'][0]['benefit_vip_full_price'],
      "benefit_vip_discount_price":website_response_json['benefits'][0]['benefits_items'][0]['benefit_vip_discount_price'],
      "item_use_credit":website_response_json['benefits'][0]['benefits_items'][0]['item_use_credit'],
      "user_level_type":0,
      "item_show_time":website_response_json['benefits'][0]['benefits_items'][0]['item_show_time'],
      "item_is_limit":website_response_json['benefits'][0]['benefits_items'][0]['item_is_limit'],
      "item_limit":website_response_json['benefits'][0]['benefits_items'][0]['item_limit'],
      "limit":100000000000,
      "user_level":0,
      "user_limit":0,
      "show_limit":100000000000,
      "is_user":""
    }]

dict = {'data':json.dumps(sessionjson_arr)}
requests.post(url,data=dict)
JustAGuy
  • 5,151
  • 11
  • 41
  • 55