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


122

외부 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);

1
참고로 이것은 API입니다 : cyclestreets.net/api- 예상되는 것을 지정하지 않는 것 같습니다.
Richard

답변:


137

일반적인 답변

귀하의 질문에 대한 일반적인 대답은 상황에 따라 다릅니다. 그리고 HTTP 헤더에 "Content-Type"이 무엇인지 지정하여 결정할 수 있습니다.

"application / x-www-form-urlencoded"값은 POST 본문이 GET 매개 변수 문자열처럼 URL 인코딩되어야 함을 의미합니다. "multipart / form-data"값은 콘텐츠를 인코딩하는 URL이 아닌 콘텐츠 구분 기호를 사용함을 의미합니다.

더 많은 정보를 원하면 이 답변에 훨씬 더 자세한 설명 이 있습니다.


구체적인 답변

사용중인 PHP 라이브러리 (CURL)에 대한 답변은 여기에서 문서를 읽어야합니다 .

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

CURLOPT_POST

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

CURLOPT_POSTFIELDS

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


9

@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 헤더와 본문을 사용합니다.


2

curl은 데이터를 인코딩하고 원시 필드 데이터를 fields 배열에 놓고 "go"라고 알려줍니다.


1
컬 포스트 데이터를 보낸 후 대상 ASP 웹 페이지가 나를 오류 페이지로 리디렉션하는 PHP 컬 스크립트를 수정하는 데 몇 시간을 보냈는데 그 이유를 알 수 없었습니다. 그런 다음 게시물 데이터를 URL 인코딩 한 후 작동하고 예상 결과를 얻기 시작했습니다.
Robi

1
그것이 배열인지 확인하면 curl에 의해 자동으로 urlencoded됩니다. 문자열로 전달되면 먼저 urlencode가 필요합니다.
Robi 2014

2

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

최근 URL 인코딩 경험을 바탕으로 질문을 더 확장하고 싶습니다. "GET HTTP 메소드와 마찬가지로 POST 데이터를 URL 인코딩해야합니다. 일반적으로 브라우저를 통한 HTML 양식이 채워지고 제출되고 / 또는 일부 정보를 가져 오면 브라우저는 URL 인코딩을 수행하지만 애플리케이션이 웹 서비스를 노출하고 소비자가 데이터에 대해 URL 인코딩을 수행하는 경우 POST HTTP 방식으로 URL 인코딩을 수행하는 것이 구조적으로나 기술적으로 옳습니까? "

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.