PHP POST不起作用。发送但参数为NULL?

3

当我尝试向Java Web服务发送JSON时,遇到了一个问题。我使用cURL来发布JSON,但是Web服务响应说我发送的参数为NULL,请参见下面的错误消息。

$data = "{'firstname': 'tom', 'surname' : 'tom', 'companyName' : 'test','phone' : 01234567, 'email' : 'test@test.com'}";                                                                                                              
$ch = curl_init('http://10.50.1.71:8080/SME/api/details.json');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($buildApplicationJSON))                                                                       
);                                                                                                                   

$result = curl_exec($ch);
var_dump($result);

我收到的响应如下所示:
```string(1042) "{"errors":[{"object":"com.application.AppDetails","field":"firstname","rejected-value":null,"message":"Property [firstname] of class [class com.application.AppDetails] cannot be null"},{"object":"com.application.AppDetails","field":"surname","rejected-value":null,"message":"Property [surname] of class [class com.application.AppDetails] cannot be null"},{"object":"com.application.AppDetails","field":"companyName","rejected-value":null,"message":"Property [companyName] of class [class com.application.AppDetails] cannot be null"},{"object":"com.application.AppDetails","field":"phone","rejected-value":null,"message":"Property [phone] of class [class com.application.AppDetails] cannot be null"},{"object":"com.application.AppDetails","field":"email","rejected-value":null,"message":"Property [email] of class [class com.application.AppDetails] cannot be null"},{"object":"com.application.AppDetails","field":"sourceCode","rejected-value":null,"message":"Property [sourceCode] of class [class com.application.AppDetails] cannot be null"}]}"```
更新:仍然无法工作。$data JSON行不是问题。在我的以前版本中,我有一个数组并使用json_encode。
$buildApplication = array(
    'firsname'          => 'Keith',
    'surname'           => 'Francis',
'companyName'       => 'Keiths Mobile Discos',
    'phone'             => '07123456789',
    'email'             => 'keith.francis@freedom-finance.co.uk',
    'sourceCode'        => 'W00T'
);
$data = json_encode($buildApplication);                                                                                                             
$ch = curl_init('http://10.50.1.71:8080/SME/api/details.json');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));                                                                 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
'Content-Type: application/json',                                                                                
'Content-Length: ' . strlen($buildApplicationJSON))                                                                       
);                                                                                                                
$result = curl_exec($ch);
var_dump($result);

$data 的上下文中,$buildApplicationJSON 是什么? - YvesLeBorg
1
更改 $data = '{"firstname": "tom", "surname" : "tom", "companyName" : "test","phone" : 01234567, "email" : "test@test.com"}'; - Alive to die - Anant
使用数组 $data['firstname'] = "value"; ... - devpro
@A-2-A 这还是无效的吧?键不应该加引号。 - Dan
本地的 JSON 键名确实应该加引号,但大多数应用程序并不需要。然而,AWS 是其中一个要求键和值都必须加引号的例子。 - user1893702
检查更新的编辑。仍然无法工作。 - Tom
2个回答

3

您的JSON格式不正确。请查看此jsfiddle的结果。

现在您可以重写这个字符串以符合JSON格式,但那样很容易出错。相反,让json_encode为您完成工作。

$data定义为PHP数组:

$data = ['firstname' => 'tom', 'surname' => 'tom', 'companyName' => 'test', 'phone' => 01234567, 'email' => 'test@test.com'];

当你想把它传递给 curl 时,请使用 json_encode

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

更好的方法是在传输前对其进行编码,并检查编码是否成功。
if( $jsondata = json_encode($data) ){
    //$jsondata is valid json
}

不起作用。我已经尝试过将数组转换为json_encode(请参见我的编辑文本),但结果仍然相同。无法理解为什么会得到空响应。 - Tom
1
在你的更新中,你对数据进行了两次json编码。只需要对PHP数组进行一次json编码即可。 - Dan

0

您发送的字符串不是有效的JSON格式,因此接收方无法从中提取值。

请注意以下两点之间的区别:

{'firstname': 'tom', 'surname' : 'tom', 'companyName' : 'test','phone' : 01234567, 'email' : 'test@test.com'}

{"firstname": "tom", "surname": "tom", "companyName": "test", "phone": 342391, "email": "test@test.com"}

通常情况下,最安全的做法是使用PHP的JSON编码函数,而不是试图硬编码。

<?php
$data = json_encode([
    'firstname' => 'tom',
    'surname' => 'tom',
    'companyName' => 'test',
    'phone' => 01234567,
    'email' => 'test@test.com'
]);

投赞成票将其置零,因为我认为这没有错。 - user1893702

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接