我应该对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-它似乎没有指定期望的内容。
理查德

Answers:


136

一般答案

您问题的一般答案是,这取决于情况。您可以通过在HTTP标头中指定“内容类型”来决定。

值为“ application / x-www-form-urlencoded”意味着您的POST正文将需要像GET参数字符串一样经过URL编码。值“ multipart / form-data”表示您将使用内容定界符,而不是对内容进行url编码。

如果您需要更多信息,此答案有更详尽的解释


具体答案

有关您正在使用的PHP库(CURL)的特定答案,请阅读此处的文档

以下是相关信息:

CURLOPT_POST

如果为TRUE,则执行常规HTTP POST。该POST是正常的application / x-www-form-urlencoded类型,最常用于HTML表单。

CURLOPT_POSTFIELDS

要在HTTP“ POST”操作中发布的完整数据。要发布文件,请在文件名前添加@并使用完整路径。可以通过在文件名后跟随类型为'; type = mimetype'的类型来明确指定文件类型。此参数可以作为urlencoded字符串(如“ para1 = val1&para2 = val2&...”)传递,也可以作为字段名称为键且字段数据为值的数组传递。如果value是一个数组,则Content-Type标头将设置为multipart / form-data。从PHP 5.2.0开始,如果使用@前缀将文件传递给此选项,则value必须是一个数组。


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数组中并告诉它“执行”即可。


1
我花了几个小时来修复PHP curl脚本,在该脚本中,目标ASP网页在发送curl数据后将我重定向到错误页面,但我无法弄清原因。然后,在对发布数据进行url编码后,它开始工作了,我开始获得预期的结果。
罗比2014年

1
它看起来是否是数组,那么它将通过curl自动进行urlencode编码。如果将其作为字符串传递,则需要先进行urlencode。
罗比2014年

2

上面的帖子回答了与URL编码及其工作原理有关的问题,但最初的问题是“我应该对POST数据进行URL编码吗?”。没有回答。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.