我们使用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_dump()
$ _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"
知道导致加号的原因是什么?
答案 0 :(得分:25)
+
加上表单数据中的字符被某些服务器解释为空格字符。
您可以通过将表单数据中的加号字符编码为%2B
来避免这种情况。不使用-d/--data
,而是使用cURL's --data-urlencode
parameter来执行此操作。
PHP's rawurlencode
function可以执行相同的编码。但是,当服务器上的PHP脚本访问传入的响应数据时,它已经被自动解码,因此您不需要(也不应该)自己调用rawurldecode
。
答案 1 :(得分:0)
您必须将适当的URL编码字符串传递给curl的data参数。您可以使用online URL encoder作为一次性情况。
答案 2 :(得分:-1)
你有魔术引号吗?
以下是解决类似问题的现有问题: Why are $_POST variables getting escaped in PHP?
你还需要对帖子值进行url编码,即使它们不像get值那样直接进入URL。
答案 3 :(得分:-1)
您可能还想考虑使用base64encode
代替urlencode
。有时urlencode/decode
会做出意想不到的事情,但我认为在这种情况下它也会对你有用。