Programming

POST 데이터를 URL 인코딩해야합니까?

procodes 2020. 7. 17. 21:55
반응형

POST 데이터를 URL 인코딩해야합니까?


외부 API에 데이터를 게시하고 있습니다 (PHP를 사용하는 경우).

전달한 POST 변수를 URL 인코딩해야합니까?

아니면 GET 데이터를 URL 인코딩하기 만하면됩니까?

감사!

업데이트 : 관련이있는 경우 내 PHP입니다.

$fields = array(
    'mediaupload'=>$file_field,
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
    'datetime'=>urlencode($_POST["datetime"]),
    'category'=>urlencode($_POST["category"]),
    'metacategory'=>urlencode($_POST["metacategory"]),
    'caption'=>($_POST["description"])
);
$fields_string = http_build_query($fields);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);

일반적인 답변

귀하의 질문에 대한 일반적인 답변은 질문에 달려 있다는 것입니다. HTTP 헤더에 "Content-Type"이 무엇인지 지정하여 결정할 수 있습니다.

"application / x-www-form-urlencoded"값은 POST 본문이 GET 매개 변수 문자열과 같이 URL로 인코딩되어야 함을 의미합니다. "multipart / form-data"값은 컨텐츠 구분 기호를 사용하고 컨텐츠를 URL 인코딩하지 않음을 의미합니다.

이 답변은 더 많은 정보를 원한다면 훨씬 더 철저한 설명 이 있습니다.


특정 답변

(CURL)을 사용하는 PHP 라이브러리에 대한 답변은 here 설명서를 읽어보십시오 .

관련 정보는 다음과 같습니다.

CURLOPT_POST

일반 HTTP POST를 수행하려면 TRUE입니다. 이 POST는 HTML 형식에서 가장 일반적으로 사용되는 일반적인 응용 프로그램 / x-www-form-urlencoded 종류입니다.

CURLOPT_POSTFIELDS

HTTP "POST"작업으로 게시 할 전체 데이터입니다. 파일을 게시하려면 파일 이름 앞에 @를 붙여 전체 경로를 사용하십시오. 파일 형식은 '; type = mimetype'형식의 파일 이름을 따라 명시 적으로 지정할 수 있습니다. 이 매개 변수는 'para1 = val1 & para2 = val2 & ...'와 같은 urlencoded 문자열로 전달되거나 필드 이름이 키이고 필드 데이터가 값인 배열로 전달 될 수 있습니다. 값이 배열 인 경우 Content-Type 헤더는 multipart / form-data로 설정됩니다. PHP 5.2.0부터는 @ 접두사가 붙은 파일이이 옵션에 전달되면 value는 배열이어야합니다.


@DougW는이 질문에 분명히 대답했지만 Doug의 요점을 설명하기 위해 여기에 코드를 추가하고 싶습니다. (그리고 위의 코드에서 오류를 수정하십시오)

해결 방법 1 : 컨텐츠 유형 헤더 : application / x-www-form-urlencoded로 POST 데이터를 URL 인코딩합니다.

참고 : $ _POST [] 필드를 하나씩 urlencode 할 필요는 없습니다. http_build_query () 함수는 urlencoding 작업을 훌륭하게 수행 할 수 있습니다.

$fields = array(
    'mediaupload'=>$file_field,
    'username'=>$_POST["username"],
    'password'=>$_POST["password"],
    'latitude'=>$_POST["latitude"],
    'longitude'=>$_POST["longitude"],
    'datetime'=>$_POST["datetime"],
    'category'=>$_POST["category"],
    'metacategory'=>$_POST["metacategory"],
    'caption'=>$_POST["description"]
);

$fields_string = http_build_query($fields);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);

해결 방법 2 : URL 인코딩없이 배열을 포스트 데이터로 직접 전달하는 반면 Content-Type 헤더는 multipart / form-data로 설정됩니다.

$fields = array(
        'mediaupload'=>$file_field,
        'username'=>$_POST["username"],
        'password'=>$_POST["password"],
        'latitude'=>$_POST["latitude"],
        'longitude'=>$_POST["longitude"],
        'datetime'=>$_POST["datetime"],
        'category'=>$_POST["category"],
        'metacategory'=>$_POST["metacategory"],
        'caption'=>$_POST["description"]
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_POST,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$fields);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);

두 코드 스 니펫 모두 작동하지만 다른 HTTP 헤더 및 본문을 사용합니다.


curl은 데이터를 인코딩하고, raw 필드 데이터를 fields 배열에 드롭하고 "go"라고 말합니다.


위의 게시물은 URL 인코딩 및 작동 방식과 관련된 질문에 답변하지만 원래 질문은 "POST 데이터를 URL 인코딩해야합니까?"였습니다. 답이 없습니다.

From my recent experience with URL Encoding, I would like to extend the question further. "Should I URL-encode POST data, same as GET HTTP method. Generally, HTML Forms over the Browser if are filled, submitted and/or GET some information, Browsers will do URL Encoding but If an application exposes a web-service and expects Consumers to do URL-Encoding on data, is it Architecturally and Technically correct to do URL Encode with POST HTTP method ?"

참고URL : https://stackoverflow.com/questions/6603928/should-i-url-encode-post-data

반응형