Я пытаюсь передать строковый массив в PHP-скрипт как данные POST, но я не уверен, что делать.
Вот мой код для выполнения 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); ?>
в<?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 !"); }
Чтобы передать массив в php в строку запроса, вы должны добавить []
в идентификатор и добавить каждый элемент в отдельную запись, поэтому что-то вроде этого должно работать:
nameValuePairs.add(new BasicNameValuePair("devices[]", device1)); nameValuePairs.add(new BasicNameValuePair("devices[]", device2)); nameValuePairs.add(new BasicNameValuePair("devices[]", device3));
теперь $_POST['devices']
на стороне php будет содержать массив.
Я думаю, вам нужно 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);
Во-первых, вам не хватает одиночных кавычек при доступе к массиву $_POST
в PHP. Изменить строку
$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);
, Это даст мне шанс помочь дальше ..