【问题标题】:PHP POST not working. Sending but NULL params?PHP POST 不工作。发送但 NULL 参数?
【发布时间】:2016-05-15 18:50:19
【问题描述】:

我在尝试将 JSON 发送到 Java Web 服务时遇到问题。我正在使用 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);

我得到的回应是 -

字符串(1042) "{"errors":[{"object":"com.application.AppDetails","field":"firstname","re​​jected-value":null,"message":"Property [class com.application.AppDetails] 的 [firstname] 不能是 null"},{"object":"com.application.AppDetails","field":"surname","re​​jected-value":null,"message":"Property [class com.application.AppDetails] 的 [姓氏] 不能是 null"},{"object":"com.application.AppDetails","field":"companyName","re​​jected-value":null,"message":"Property [class com.application.AppDetails] 的 [companyName] 不能是 null"},{"object":"com.application.AppDetails","field":"phone","re​​jected-value":null,"message":"Property [class com.application.AppDetails] 的 [phone] 不能 null"},{"object":"com.application.AppDetails","field":"email","re​​jected-value":null,"message":"Property [class com.application.AppDetails] 的 [email] 不能 null"},{"object":"com.application.AppDetails","field":"sourceCode","re​​jected-value":null,"message":"Property [class com.application.AppDetails] 的 [sourceCode] 不能是 空"}]}"

更新:仍然无法正常工作。 $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);

【问题讨论】:

  • $buildApplicationJSON$data 的上下文中是什么?
  • 更改$data = '{"firstname": "tom", "surname" : "tom", "companyName" : "test","phone" : 01234567, "email" : "test@test.com"}';
  • 使用数组 $data['firstname'] = "value"; ....
  • @A-2-A 那不是还是无效的吗?不应引用键。
  • Native json 键确实应该被引用,但大多数应用程序不需要这个。然而,AWS 就是这样一个例子,它要求键和值都被引用。

标签: php json curl


【解决方案1】:

您的 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 数组(请参阅我编辑的文本),我得到了相同的结果。无法理解为什么我得到空响应..
  • 在您的更新中,您对数据进行了两次 json_encoding。只对 PHP 数组进行一次 json_encode
【解决方案2】:

您发送的字符串不是有效的 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"}

如果您使用 phps json 编码功能而不是尝试硬编码,通常是最安全的:

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

【讨论】:

  • 投票结果为 0,因为我认为这没有任何问题。
猜你喜欢
  • 2014-08-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
相关资源
最近更新 更多