Php $\u删除后值获取加号

Php $\u删除后值获取加号,php,post,curl,Php,Post,Curl,我们使用POST通过API调用传递ssh公钥。奇怪的是,当我们在PHP中获得值时,加号(+)被完全去除。显然,这不起作用,因为它会更改公钥的值 请参阅以下原始卷曲请求: curl "https://api.example.com/v1/keys" -X POST -d "key=ssh-dss AAAAB3NzaC1kc3MAAACBAOLsyYuyI0/3/UjajY8ljdgkAV2k9jZxjlVGWvHa9afMuO7DqsOcu0o4e5D9TPScsO5XrgTrmcXHkOtM54

我们使用POST通过API调用传递ssh公钥。奇怪的是,当我们在PHP中获得值时,加号(+)被完全去除。显然,这不起作用,因为它会更改公钥的值

请参阅以下原始卷曲请求:

curl "https://api.example.com/v1/keys" -X POST -d "key=ssh-dss AAAAB3NzaC1kc3MAAACBAOLsyYuyI0/3/UjajY8ljdgkAV2k9jZxjlVGWvHa9afMuO7DqsOcu0o4e5D9TPScsO5XrgTrmcXHkOtM54fOPdXSzonWOXUIn1XEumdHDlv9YRZTCW/A9qajhPR67y+92su9AqeGXI0/q3BXZsZcC1nr1NjgSiz++r+YZFVWfQsNAAAAFQCYBf0KXVLfYUE6cOTbWnBWn5Py9QAAAIEA3WAkAwhR7fhwWpxuwxNnsB8NXwsEs2NWiOaiMu3dmDWyqGRjfOYUchoLelBMpv4oLTZuaGW4/DCWfdh6pgrxs39MXf+FdTir8KeHIIoXEdcXpWqnuyNBdXn5XNY54vc1eMkbm4q3D1i3+IMhNAURasdvFRoDzgH9s68Ik3P5HrMAAACAab+CiT010wXMzv+6v+oWcRWbxhGou/ND+K2QGU1kAW+KuUGmhOgB6XPka7iEsIeA/+Ojh+OiNedFZlJAZq1jarew106YCOrUlbtDk7pAAUJQhIhKFhpNE0UhLRBWOF9LpjDwWu55dlrfLURE32TuMx/NsazWVypbzJqy48d2sg8= justin@mbpro"
但是,当我们在PHP中
var\u dump()
out$\u POST['key']的值时,它是:

string(601) "ssh-dss AAAAB3NzaC1kc3MAAACBAOLsyYuyI0/3/UjajY8ljdgkAV2k9jZxjlVGWvHa9afMuO7DqsOcu0o4e5D9TPScsO5XrgTrmcXHkOtM54fOPdXSzonWOXUIn1XEumdHDlv9YRZTCW/A9qajhPR67y 92su9AqeGXI0/q3BXZsZcC1nr1NjgSiz  r YZFVWfQsNAAAAFQCYBf0KXVLfYUE6cOTbWnBWn5Py9QAAAIEA3WAkAwhR7fhwWpxuwxNnsB8NXwsEs2NWiOaiMu3dmDWyqGRjfOYUchoLelBMpv4oLTZuaGW4/DCWfdh6pgrxs39MXf FdTir8KeHIIoXEdcXpWqnuyNBdXn5XNY54vc1eMkbm4q3D1i3 IMhNAURasdvFRoDzgH9s68Ik3P5HrMAAACAab CiT010wXMzv 6v oWcRWbxhGou/ND K2QGU1kAW KuUGmhOgB6XPka7iEsIeA/ Ojh OiNedFZlJAZq1jarew106YCOrUlbtDk7pAAUJQhIhKFhpNE0UhLRBWOF9LpjDwWu55dlrfLURE32TuMx/NsazWVypbzJqy48d2sg8= justin@mbpro"

知道是什么原因导致加号被删除了吗?

+
表单数据中的加号被一些服务器解释为空格字符

通过将表单数据中的加号编码为
%2B
,可以避免这种情况。不要使用
-d/--data
,而是使用来执行此操作


如果正在构造传出请求,则可以执行相同的编码。但是,当服务器上的PHP脚本访问传入的响应数据时,它已经被自动解码,因此您不需要(也不应该)调用自己。

您必须向curl的数据参数传递一个经过适当URL编码的字符串。您可以在一次性的情况下使用“魔法引号”。

是否打开了“魔法引号”

以下是一个解决类似问题的现有问题:


您还需要URL编码POST值,即使它们不像URE值那样直接进入URL。

您也可以考虑使用<代码> Base64 Engule<代码>,而不是<代码> URLCONDEX/<代码>。有时候,

urlencode/decode
会做一些意想不到的事情,尽管我认为它在这种情况下也适用


小心点,并不是每种情况下+都被编码为%20。是的,这是一个问题,我们不想要求用户在复制并粘贴到和API中并用%2B替换加号时手动检查公钥。既然我们知道ssh公钥永远不会有空格,那么我们可以在后端破解它,并用+符号替换空格吗?与其使用
-d
,不如尝试使用
--data urlencode
。我认为它应该为您处理这个问题。--data urlencode工作,只需在文档中指定他们必须使用该标志,而不是-d