我应该对 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);
191259 次浏览

一般答案

对于你的问题,一般的回答是,这取决于。您可以通过指定 HTTP 头中的“ Content-Type”来决定。

值为“ application/x-www-form-urlencode”意味着您的 POST 主体需要像 GET 参数字符串一样进行 URL 编码。值为“ multipart/form-data”意味着您将使用内容分隔符和 NOT url 编码内容。

如果您需要更多信息,这个答案有更详细的解释


具体答案

对于特定于您正在使用的 PHP 库(CURL)的答案,应该使用 请阅读这里的文件

以下是相关信息:

CURLOPT _ POST

TRUE 来执行常规的 HTTP POST。 这个 POST 是普通的应用程序/x-www-form-urlencode 类型,最常用于 HTML 表单。

CURLOPT _ POSTFIELDS

要在 HTTP“ POST”操作中发布的完整数据。要发布文件,请在文件名前面加上@并使用完整路径。可以通过在文件名后面显式指定格式为“ ; type = imetype”的文件类型。这个参数可以作为 urlencode 字符串(如‘ para1 = val1 & para2 = val2 & ...’)传递,也可以作为字段名作为键、字段数据作为值的数组传递。如果 value 是一个数组,Content-Type 头将被设置为 multipart/form-data。从 PHP 5.2.0开始,如果文件以@前缀传递给这个选项,value 必须是一个数组。

Curl 将为您对数据进行编码,只需将原始字段数据放入字段数组并告诉它“ go”即可。

@ DougW 已经清楚地回答了这个问题,但是我还是想在这里添加一些代码来解释 Doug 的观点。(并纠正上述代码中的错误)

解决方案1: 使用内容类型的 Header 对 POST 数据进行 URL 编码: application/x-www-form-urlencode。

注意: 您不需要对 $_ POST []字段逐个进行 urlencode,http _ build _ query ()函数可以很好地完成 urlencode 工作。

$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 头和主体。

以上帖子回答了与 URL 编码相关的问题以及它是如何工作的,但是最初的问题是“我应该对 POST 数据进行 URL 编码吗?”这个问题没有答案。

根据我最近的 URL 编码经验,我想进一步扩展这个问题。 ”我是否应该对 POST 数据进行 URL 编码,与 GET HTTP 方法相同。一般来说,HTML 表单通过浏览器,如果填写,提交和/或获取一些信息,浏览器将进行 URL 编码,但如果一个应用程序公开了一个网络服务,并期望消费者对数据进行 URL 编码,是否在架构上和技术上正确的 URL 编码 POST HTTP 方法?”