๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ์ธ ๊ณต๋ถ€/๋„คํŠธ์›Œํฌ

HTTP form data ์ „์†ก

by syLim___ 2023. 10. 4.
728x90

 

HTTP request message๋Š” HTTP header์™€ HTTP body๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

 

(์ฐธ๊ณ ๋กœ, HTTP ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ์„ค๋ช…์€ ์ด์ „์— ๋”ฐ๋กœ ์ •๋ฆฌํ•ด๋’€์—ˆ๋‹ค.)

 


 

ํ—ค๋”์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ•„์š”ํ•œ ์ •๋ณด๋“ค์ด ๋‹ด๊ธฐ๋Š”๋ฐ,

์ด ์ค‘ Content-Type์€ HTTP body์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋ฌด์—‡์ธ์ง€ ๋ช…์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

Content-Type์˜ ์ข…๋ฅ˜๋กœ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ text/html, text/css, text/javascript, application/json, application/x-www-urlencoded, multipart/form-data ๋“ฑ์ด ์žˆ๋‹ค.

์ด ์ค‘์—์„œ, ํŒŒ์ผ ์ „์†ก์— ์‚ฌ์šฉ๋˜๋Š” multipart format์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. 

(Content-Type: multipart/form-data)



โœ… ๋ฉ€ํ‹ฐํŒŒํŠธ ํฌ๋งท ๋ฐ์ดํ„ฐ ์ „์†ก


 - ๋ณด๋‚ด๋ ค๋Š” ํŒŒ์ผ์„ ๋ฌธ์ž์—ด๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.

 - ๋‚˜๋ˆ„์–ด์ง„ ๊ฐ ๋ถ€๋ถ„(ํŒŒํŠธ)์— ๋Œ€ํ•œ ์„ค๋ช…(ํ—ค๋”)๋ฅผ ๋‹ฌ์•„์„œ body์— ์ถ”๊ฐ€ํ•œ๋‹ค.

 - ๊ฐ ํŒŒํŠธ๋Š” ์ž„์˜์˜ ๋ฌธ์ž์—ด์ธ boundary์— ์˜ํ•ด ๊ตฌ๋ถ„ํ•œ๋‹ค.

 

 - ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด body์— ๋‹ด๊ธด ๊ฒƒ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ "ํ—ค๋”+content" ์กฐ๊ฐ๋“ค์ด๋‹ค.

 - ๊ฐ "ํ—ค๋”+content" ์กฐ๊ฐ์€ form-data ํƒ€์ž…์ด๋‹ค.

 - body๋Š” form-data ํƒ€์ž…์˜ ์กฐ๊ฐ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„ multipart ํƒ€์ž…์ด๋‹ค.

 - ๋”ฐ๋ผ์„œ, body์˜ Content-Type์€ multipart/form-data๋กœ ์ ์–ด์ค€๋‹ค.

 

 - Boundary๋กœ ๊ตฌ๋ถ„๋˜์–ด ๋‚˜๋ˆ„์–ด์ง„ ๊ฐ ๋ถ€๋ถ„(ํŒŒํŠธ)์€ ์ž์‹ ๋งŒ์˜ ํ—ค๋”๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ–ˆ๋‹ค.

 - ์ „์†กํ•˜๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ(content)์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋ฐ”๋กœ ์—ฌ๊ธฐ์— ๋ช…์‹œ๋œ๋‹ค. (Content-Type: ํƒ€์ž…๋ช… ํ˜•์‹)

 


๐Ÿฅ ๋ฉ€ํ‹ฐํŒŒํŠธ ๋ฉ”์‹œ์ง€  body ์˜ˆ์‹œ

 

์•„์ฃผ ๊ฐ„๋‹จํžˆ ๋‚˜ํƒ€๋‚ด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.


--boundary

ํ—ค๋”


ํŒŒ์ผ ๋‚ด์šฉ (๋ฌธ์ž์—ด)
--boundary

ํ—ค๋”


ํŒŒ์ผ ๋‚ด์šฉ (๋ฌธ์ž์—ด)
--boundary--


--๋ฐ”์šด๋”๋ฆฌ : ํŒŒํŠธ์˜ ์‹œ์ž‘์„ ์•Œ๋ฆฐ๋‹ค.

--๋ฐ”์šด๋”๋ฆฌ-- : ๋งจ ๋งˆ์ง€๋ง‰ ํŒŒํŠธ ์•„๋ž˜์— ์ ์–ด์„œ ๋์„ ์•Œ๋ฆฐ๋‹ค.



๐Ÿฅ ๊ฐ ํŒŒํŠธ์˜ ํ—ค๋”๋ฅผ ํ•˜๋‚˜์”ฉ ๋œฏ์–ด๋ณด์Ÿˆ.

Content-Disposition: form-data;    // ์ด ๋ฐ์ดํ„ฐ ํŒŒํŠธ๋Š” form๋ฐ์ดํ„ฐ ํ˜•์‹์ด๋ผ๋Š” ์˜๋ฏธ
name="name";    // ๋ฐ์ดํ„ฐ ํŒŒํŠธ(ํ•„๋“œ)์˜ ์ด๋ฆ„ (ํ•„์ˆ˜ํ•ญ๋ชฉ)
filename="fileName"   // ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ํŒŒ์ผ ์ด๋ฆ„์„ ์ ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

Content-Type: image/png   // ์ด ๋ฐ์ดํ„ฐ ํŒŒํŠธ์— ๋‹ด๊ธด content๋Š” image/png ํƒ€์ž…์ด๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

 


 

โœ… HTTP request message ์ง์ ‘ ์ž‘์„ฑํ•ด๋ณด๊ธฐ!

 

์ด๋ ‡๊ฒŒ ์ƒ๊ธด hi.txt๋ผ๋Š” ํŒŒ์ผ์„ form data ํ˜•์‹์œผ๋กœ POST ์ „์†กํ•ด๋ณด๊ธฐ ์œ„ํ•ด
HTTP request message๋ฅผ ์ƒ์„ฑ, ์ถœ๋ ฅํ•˜๋Š” ์•„์ฃผ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ์งœ๋ณด์•˜๋‹ค.

 

 

JAVA

final String BOUNDARY = "----AAAA";  
final String LINEFEED = "\r\n";  
  
// ํ—ค๋” ์ž‘์„ฑ  
StringBuilder header = new StringBuilder();  
  
header.append("POST /post HTTP/1.1\n");  
header.append("Content-Type: multipart/form-data; boundary=" + BOUNDARY + "\n");  
  
  
// ๋ฐ”๋”” ์ž‘์„ฑ  
StringBuilder body = new StringBuilder();  
body.append("--" + BOUNDARY + LINEFEED);  
  
body.append("Content-Disposition: form-data; name=\"upload\"; filename=\"hi.txt\"\n");  
body.append("Content-Type: text/plain\n");  
body.append(LINEFEED);  
  
int len;  
try(FileReader reader = new FileReader("/Users/sylim/hi.txt")){  
    char[] buffer = new char[1024];  
    while((len=reader.read(buffer)) != -1){  
        body.append(buffer, 0, len);  
    }  
} catch (IOException ignore){ }  
body.append(LINEFEED);  
  
body.append("--" + BOUNDARY + "--");  
body.append(LINEFEED);  
  
  
// HTTP request message ์ถœ๋ ฅ  
String httpRequestMessage = header.toString() + "\n" + body.toString();  
System.out.println(httpRequestMessage);




 

โœ… ์ฐธ๊ณ  ์ž๋ฃŒ References

 

 - https://www.youtube.com/watch?v=V5vZWHP-RqU 

 - https://jw910911.tistory.com/117

 

 

 

 

728x90