将字符串数组作为 POST 传递给 PHP
Posted
技术标签:
【中文标题】将字符串数组作为 POST 传递给 PHP【英文标题】:Passing String array to PHP as POST 【发布时间】:2013-03-28 21:50:35 【问题描述】:我正在尝试将字符串数组作为 POST 数据传递给 php 脚本,但不确定该怎么做。
到目前为止,这是我执行 PHP 脚本的代码:
我试图传递数组的地方:
nameValuePairs.add(new BasicNameValuePair("message",message));
String [] devices = device1,device2,device3;
nameValuePairs.add(new BasicNameValuePair("devices", devices));// <-- Can't pass String[] to BasicNameValuePair
callPHPScript("notify_devices", nameValuePairs);
调用PHP脚本:
public String callPHPScript(String scriptName, List<NameValuePair> parameters)
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://localhost/" + scriptName);
String line = "";
StringBuilder stringBuilder = new StringBuilder();
try
post.setEntity(new UrlEncodedFormEntity(parameters));
HttpResponse response = client.execute(post);
if (response.getStatusLine().getStatusCode() != 200)
System.out.println("DB: Error executing script !");
else
BufferedReader rd = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
line = "";
while ((line = rd.readLine()) != null)
stringBuilder.append(line);
catch (IOException e)
e.printStackTrace();
System.out.println("DB: Result: " + stringBuilder.toString());
return stringBuilder.toString();
还有相关的 PHP 脚本:
<?php
include('tools.php');
// Replace with real BROWSER API key from Google APIs
$apiKey = "123456";
// Replace with real client registration IDs
$registrationIDs = array($_POST[devices]); <-- Where I want to pass array to script
// Message to be sent
$message = $_POST['message'];
// Set POST variables
$url = 'https://android.googleapis.com/gcm/send';
$fields = array(
'registration_ids' => $registrationIDs,
'data' => array( "message" => $message ),
);
$headers = array(
'Authorization: key=' . $apiKey,
'Content-Type: application/json'
);
// Open connection
$ch = curl_init();
// Set the url, number of POST vars, POST data
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );
// Execute post
$result = curl_exec($ch);
// Close connection
curl_close($ch);
print_as_json($result);
?>
有什么想法吗?谢谢!
编辑
我正在尝试以下方法,但仍然没有乐趣:
public void notifyDevices(Message message)
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
List<String> deviceIDsList = new ArrayList<String>();
String [] deviceIDArray;
//Get devices to notify
List<JSONDeviceProfile> deviceList = getDevicesToNotify();
for(JSONDeviceProfile device : deviceList)
deviceIDsList.add(device.getDeviceId());
//Array of device IDs
deviceIDArray = deviceIDsList.toArray(new String[deviceIDsList.size()]);
for(String deviceID : deviceIDArray)
nameValuePairs.add(new BasicNameValuePair("devices[]", deviceID));
//Call script
callPHPScript("GCM.php", nameValuePairs);
这就是我所有的“错误报告”......
HttpResponse response = client.execute(post);
if (response.getStatusLine().getStatusCode() != 200)
System.out.println("DB: Error executing script !");
【问题讨论】:
nameValuePairs.add(new BasicNameValuePair("devices[]", device1));
, nameValuePairs.add(new BasicNameValuePair("devices[]", device2));
... 怎么样?
@dev-null-dweller:您应该将其发布为答案。
我现在试试,谢谢!
【参考方案1】:
要在查询字符串中将数组传递给 php,您应该将 []
添加到标识符并将每个项目添加为单独的条目,所以这样的事情应该可以工作:
nameValuePairs.add(new BasicNameValuePair("devices[]", device1));
nameValuePairs.add(new BasicNameValuePair("devices[]", device2));
nameValuePairs.add(new BasicNameValuePair("devices[]", device3));
现在,php 端的$_POST['devices']
将包含一个数组。
【讨论】:
嘿,我正在尝试这个,但它不起作用,我不知道如何让 Java 打印出 PHP 错误,所以我只是收到“执行脚本错误”消息。我已经用我正在尝试的代码更新了我的帖子.. $_POST['devices'],不是更正确的数组($_POST['devices']); ¿? 成功了!这真的很简单。我的客户端 java 代码: RequestBody formBody = new FormBody.Builder() .add("myArray[]", "abc") .add("myArray[]", "def") .add("myArray[]", " ghi") .build();我的 php 服务器代码: $myArray=isset($_POST['myArray']) ? $_POST['myArray'] : '';【参考方案2】:我认为您应该对您的设备数组进行 json 编码,以便获得一个可以将其传递给 BasicNameValuePair(...) 的字符串。 在你的 php 代码中,你只需要使用 json_decode 来取回一个数组。
JSONArray devices = new JSONArray();
devices.put(device1);
devices.put(device2);
devices.put(device3);
String json = devices.toString();
nameValuePairs.add(new BasicNameValuePair("devices", devices));
在你的 php 代码中:
$devices = $_POST['devices'];
$devices = json_decode($devices);
【讨论】:
@Tom celic 你解决了吗?我也遇到了同样的问题。 什么是nameValuePairs【参考方案3】:首先,在 PHP 中访问 $_POST
数组时缺少单引号。换行
$registrationIDs = array($_POST[devices]);
到:
$registrationIDs = array($_POST['devices']);
您应该启用错误日志记录或 PHP 错误消息的输出以使用 ini 值 display_errors
、log_errors
、error_reporting
进行调试,以便注意到此类错误。
但即使array($_POST['devices'])
也不会做预期的事情。 array(...)
是 php 中的数组初始化构造。这意味着您只需将 ($_POST['devices']) 包装到另一个数组中。
...想查看var_dump($_POST);
的输出。这将使我有机会进一步提供帮助..
【讨论】:
这不是问题,第一个也可以,但会引发额外的通知 您可以使用php.ini
文件(全局)或使用函数ini_set($key, $value)
将这些设置设置为适当的值。注意我对array(...)
构造的更新以上是关于将字符串数组作为 POST 传递给 PHP的主要内容,如果未能解决你的问题,请参考以下文章
将 PHP $_POST 数组传递给 javascript/jQuery 以通过 ajax 发送回 PHP
通过 jQuery AJAX 将字符串数组传递给 C# WebMethod