본문 바로가기
ETC/Python

JQuery Ajax Post 파이썬으로 구현하기

by Guardy 2024. 11. 5.
728x90
반응형

다음과 같이 JQuery Ajax로 post를 요청할때

그 ajax 아님

$.ajax({
	url : "/test.do",
        type : "POST",
        contentType : "application/json",
        data : JSON.stringify(send_data),
        success : function(data) {
            console.log(data);
        }
});

이를 파이썬 코드로 변경하고싶으면 다음과 같이 작성하면된다.

import requests
import json

url = "https://example.com/test.do" 
send_data = {
    "key1": "value1",
    "key2": "value2"
}

headers = {"Content-Type": "application/json"}
response = requests.post(url, data=json.dumps(send_data), headers=headers)

if response.status_code == 200:
    print(response.json()) 
else:
    print("Request failed with status:", response.status_code)

그런데, 가끔 post 요청을 보낼때 encodeURIComponent를 해서 보내는 경우가 있다.

 

encodeURIComponent를 사용하는 이유는 데이터를 URL-safe 포맷으로 변환하여 전송하기 위해서인데, 주로 다음과 같은 이유에서 사용한다.

1. 특수 문자의 인코딩 URL이나 쿼리 문자열에 사용될 수 없는 특수 문자(예: &, =, ?, #, 공백 등)를 포함한 데이터를 안전하게 전송하기 위해서

2. URL 인코딩 요구사항을 맞추기 위해 서버나 특정 API가 URL-safe 인코딩된 데이터를 요구하는 경우가 있어서

3. 쿼리 문자열로 전달할 때의 안전성 확보 만약 JSON 데이터를 쿼리 문자열로 GET 요청이나 x-www-form-urlencoded POST 요청에 포함시킨다면, 인코딩하지 않으면 예상치 못한 쿼리 파라미터 구분이나 값의 잘림 등이 발생할 수 있어서

그래서 다음과 같이 encodeURIComonent로 json데이터를 stringfy하여 보내는 경우가 있는데

$.ajax({
	url : "/test.do",
        type : "POST",
        dataType : "JSON",
        data : "json=" + encodeURIComponent(JSON.stringify(send_data)),
        success : function(data) {
            console.log(data);
        }
});

이런 경우 개발자도구로 확인해보면 payload부분에 다음과 같이 찍힌다.

json=%7B%22...

이를 위와 같은 파이썬 코드로 보내면 서버에서 인식을 하지 못하기 때문에 javascript와 같은 방식으로 파이썬을 수정해주어야한다.

import requests
import json
import urllib.parse

url = "https://example.com/test.do" 

send_data = {
    "key1": "value1",
    "key2": "value2"
}

encoded_data = "json=" + urllib.parse.quote(json.dumps(send_data))

headers = {"Content-Type": "application/x-www-form-urlencoded"}
response = requests.post(url, data=encoded_data, headers=headers)

if response.status_code == 200:
    print(response.json())
else:
    print("Request failed with status:", response.status_code)

 

728x90
반응형