Я занимаюсь разработкой приложения для Android, которое связывается с сервером Apache Tomcat для отправки и получения данных.Один из сервлетов связывается с сервером сокетов python, работающим на localhost, и фактически выполняет логические операции с базой данных.В коде моего приложения есть две функции, которые взаимодействуют с сервером, во-первых, который получает ответ и интерпретирует его как возвращающий только результаты «Успех» или «Сбой» (dataExchange(String)
), а вторая, которая возвращает полный ответ какмассив JSON (dataExchangeWithReturn(String)
) (все взаимодействие происходит с использованием JSON).Первая функция внутренне вызывает вторую функцию для получения ответа, а вторая функция вызывает третью функцию для связи с помощью Http post-запроса с сервером.Вторая функция при непосредственном вызове работает отлично.Однако первая функция, очевидно, отправляет данные мусора, что приводит к следующей ошибке на сервере Python API: 'utf-8' codec can't decode byte 0x9b in position 1: invalid start byte
.Когда я печатаю строку, которая должна быть отправлена через dataExchange(String)
на Android Studio Logcat, она печатает обычную строку, идентичную той, которая отправляется с использованием dataExchangeWithReturn(String)
.Я не могу понять, почему данные, отправляемые с помощью первой функции, не читаются сервером, в то время как вторая функция прекрасно работает.
Пример ответа на запрос на стороне сервера для dataExchangeWithReturn(String)
:
Request recieved from: ('127.0.0.1', 48358)
Request : {"request":"e_u_m","contact_number":"9898871289"}
Parsed string : {'request': 'e_u_m', 'contact_number': '9898871289'}
--------------
Sending Response :
[{"name": "Employee", "email": "employeee@email.com",
"contact_number": "1111111111", "supervisor_id": "9898871289",
"supervisor_name": "Shivang", "no_assigned_leads": "1",
"address_street": "Addr", "address_area": "area", "address_city": ""}]
Пример ответа на стороне сервера для dataExchange(String)
:
Request recieved from: ('127.0.0.1', 48368)
'utf-8' codec can't decode byte 0x9b in position 1: invalid start byte
--------------
Sending Response :
[{'resp': 'Wrong format'}]
Ниже приведен код для всех трех функций, упомянутых здесь:
public static int dataExchange(String data)
{
int result = FAILURE;
try
{
JSONArray receivedData = dataExchangeWithReturn(data);
if(receivedData.length() == 0)
Log.i("DataExchange","Server sent no data !");
JSONObject dataObject = receivedData.getJSONObject(0);
String response = dataObject.getString("response");
if(response.equalsIgnoreCase("success"))
result = SUCCESS;
}
catch (JSONException e)
{
Log.i("DataExchange","Server sent malformed data");
e.printStackTrace();
}
return result;
}
public static JSONArray dataExchangeWithReturn(String data)
{
JSONArray receivedData;
String received;
try
{
Log.i("SendingRequest", data);
received = getResponse(data);
receivedData = new JSONArray(received);
Log.i("DataExchange", receivedData.toString());
if(receivedData.length() == 0) {
Log.i("ServerIssue", "Server did not sent data !");
}
return receivedData;
}
catch (JSONException e)
{
Log.i("DataExchangeReturn", e.getMessage());
return new JSONArray();
}
catch (Exception e)
{
e.printStackTrace();
return new JSONArray();
}
}
public static String getResponse(String requestString)
{
try
{
String data = "/api-sample/call";
URL connectionUrl = new URL("http", MainActivity.SERVER_IP_ADDR, MainActivity.SERVER_PORT, data);
HttpURLConnection conn = (HttpURLConnection) connectionUrl.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
// Writing JSON data
conn.setDoOutput(true);
OutputStream osw = conn.getOutputStream();
osw.write(requestString.getBytes(StandardCharsets.UTF_8));
osw.close();
// Reading response
StringBuilder response = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String temp;
while((temp = br.readLine()) != null)
{
response.append(temp);
}
br.close();
// System.out.println(response.toString());
return response.toString();
}
catch(Exception e)
{
e.printStackTrace();
return new String();
}
}
Также обратите внимание, что перед настройкойна сервере Apache Tomcat я использовал простую связь между сокетом и сокетом TCP, в которой все эти функции работали идеально.