Использование JSON в PHP
я использую json-простой из Java для получения и запроса данных в формате JSON из PHP. Но я не придумал, как сделать правильный код из PHP для отправки и получения и в Java для получения.
JAVA-код для отправки и получения
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class JSONManager<T> {
// CLASS PROPERTIES
private static JSONManager ourInstance = new JSONManager();
private static final String USER_AGENT = "Mozilla/5.0";
private static final String SERVER_PATH = "http://localhost/";
// CLASS METHODS
public static JSONManager getInstance() {
return ourInstance;
}
// CONSTRUCTORS
private JSONManager() {
}
// METHODS
public synchronized void send() throws IOException{
// SE AÑADEN ALGUNOS DATOS...
final JSONObject jsonObject = new JSONObject();
jsonObject.put("name","foo");
jsonObject.put("age", 20);
final List listOfJSONObjects = new LinkedList<>(Arrays.asList(jsonObject));
// SE GENERA EL STRING DE JSON...
String jsonString = JSONValue.toJSONString(listOfJSONObjects);
// SE MUESTRA POR CONSOLA EL JSON GENERADO...
System.out.printf("JSON generado: %s \n\n", jsonString);
// SE CODIFICA EL JSON A UNA URL
jsonString = URLEncoder.encode(jsonString, "UTF-8");
String urlString = SERVER_PATH+"onListenerJSONJava.php"; // TODO <-- No se cómo debe ser el código allí.
// SE GENERA UNA URL Y SE ABRE LA CONEXIÓN CON EL SERVIDOR
final HttpURLConnection huc = (HttpURLConnection) new URL(urlString).openConnection();
// SE AÑADE LA CABECERA
huc.setRequestMethod("POST");
huc.setRequestProperty("User-Agent", USER_AGENT);
huc.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
// SE ENVIAN LOS DATOS
final String postParameters = "jsonJAVA="+jsonString;
huc.setDoOutput(true);
final DataOutputStream dos = new DataOutputStream(huc.getOutputStream());
dos.writeBytes(postParameters);
dos.flush();
dos.close();
// SE CAPTURA LA RESPUESTA DEL SERVIDOR
final int responseCode = huc.getResponseCode(); // TODO <-- No se cómo debe ser el código allí.
BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
response.append(inputLine);
}
// SE MUESTRA POR CONSOLA EL 'MENSAJE' ENVÍADO AL SERVIDOR Y SU CÓDIGO DE RESPUESTA
System.out.printf("\nSending 'POST' request to URL: %s\nPost parameters: %s\nResponse code: %d\n",
urlString, postParameters,responseCode);
// SE MUESTRA LA RESPUESTA DEL SERVIDOR Y SE CIERRA LA CONEXIÓN
System.out.printf("\nResponse: %s:",response.toString());
br.close();
}
public <T extends Object> T receive() {
// TODO <-- No sé hacerlo aquí.
return null;
}
}
PHP код для получения. / / Fala отправить...
if(isset($_POST["jsonJAVA"])){
$json = $_POST["jsonJAVA"];
// EN ESTE PUNTO NO SÉ COMO OBTENER EL JSON DESDE MI APP EN JAVA Y RESPONDER POR SUPUESTO...
// TODO
// GUARDAR DATOS EN BBDD SI ES NECESARIO TRAS VALIDARLOS...
// TODO <-- Esto ya sé hacerlo.
}
?>
3 answers
С частью Java я могу вам помочь.
Чтобы отправить данные на сервер, мы, очевидно, собираемся использовать метод POST; что мне не нравится в подходе, который вы используете, так это то, как вы создаете JSON. Java является объектно-ориентированным языком, и поэтому проблемы должны решаться таким образом, я предлагаю вам следующее:
Предположим, что я хочу отправить JSON типа Person, у человека есть атрибуты имя и фамилия; поэтому я создаю объект Person следующим образом:
public class Persona {
private String nombre;
private String apellido;
//incluir los metodos get y set para cada atributo
}
Затем где-то в моем коде я должен заполнить сюжет, который я хочу отправить на сервер, либо по базе данных, либо статическими данными
Persona p = new Persona();
p.setNombre("Yo");
p.setApellido("Tu");
Чтобы преобразовать этот класс в JSON в полете, я рекомендую Это, которое я сделал с помощью Gson
private static Gson gson = new Gson();
public static String objetoAJson(Object o) {
return gson.toJson(o);
}
Таким образом, вы просто передаете объект (список или уникальный объект) методу objetoAJson
, и String
будет возвращен с вашим JSON, готовым к отправке.
Теперь, после того, как у вас есть JSON готов, вы должны отправить его с POST
Я предлагаю вам этот метод
public static String sendPost(String url, String data) throws Exception {
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestProperty("User-Agent", USER_AGENT);
con.setRequestProperty("Accept","*/*");
con.setRequestProperty("Content-Type","application/json");
con.setDoOutput(true);
con.setDoInput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(data);
wr.flush();
wr.close();
data = null;
System.out.println("\nSending 'POST' request to URL : " + url);
InputStream it = con.getInputStream();
InputStreamReader inputs = new InputStreamReader(it);
BufferedReader in = new BufferedReader(inputs);
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println("Servidor dice : " + response.toString());
return response.toString();
}
Вам просто нужно определить URL-адрес, куда должен поступать контент, и, конечно же; контент (JSON), который вы собираетесь отправлять. Остальное зависит от вашего кода на сервере, который находится в PHP, и там, если я не знаю, потому что я избегаю PHP.
Чтобы получить JSON с вашего сервера, мы используем GET (еще проще)
public static InputStream getJson(String _url) {
try{
URL url = new URL(_url);
URLConnection urlConnection = url.openConnection();
return urlConnection.getInputStream();
}catch(Exception e) {
return null;
}
}
Результат будет возвращен в InputStream, который может быть преобразован в String так:
String text = new Scanner(>>aquí tu stream recibido<<).useDelimiter("\\A").next();
И вуаля, у вас будет ответ сервера (JSON или какая-то ошибка), и вы сможете работать с ним.
Любые сомнения, на заказ. Приветствую!
Насколько я понимаю, вы выполняете запрос XHR
из Java в PHP
, в котором содержимое запроса является JSON
. Если это так, в вашем файле PHP
способ интерпретации будет использовать json_decode().
<?php
if(isset($_POST["jsonJAVA"])){
$json = json_decode($_POST["jsonJAVA"]);
# De aquí en adelante es validar, guardar en DB
# y responder
}
PHP должен возвращать какой-то тип данных HTML. PHP работает на стороне сервера, а запрос JAVA выполняется на стороне клиента, поэтому вам нужно написать некоторые данные типа HTML, как если бы вы посещали веб-страницу. Я объясняю с вашим примером:
<?php
// Comprobacion
if(isset($_POST["jsonJAVA"])){
// Ejecutas todo el contenido que quieras hacer con esta
// variable, ya sea guardar o sacar datos.
// Si quisieras sacar valores a datos json seria:
$json['nombre_salida'][] = array('variable' => 'dato', 'variable' => 'dato'); //Etc
}
// Finalmente necesitamos establecer las cabeceras y sacar los datos a HTML
header('Content-Type: application/json');
header('Content-Type: text/html; charset=utf-8');
echo json_encode($json);
?>
Это будет синтаксис. С уважением.