android如何向服务器发送数据? (初学者)
How to send data to server in android? (Beginner)
我一直在尝试向服务器发送 JSON 数据。但是,我的努力失败了,因为 NameValuePair 已被弃用。 okHttp 给出了一些错误,例如 okie.string not found on library classpath。有人知道吗?请给我一些其他的技巧。我尝试了很多 Google 但是,这些文章没有帮助,因为文章太旧了。
任何链接或示例肯定会有帮助。
为此使用改造。 Retrofit Update
好的,这就是我所做的,我将编写自己的 HttpRequest 库,而不是默认库。如果你想使用这个代码,你必须做很多改变,但是指导我认为很好,以后我写的代码更好。
首先,您必须以这种方式json在 android 上验证您的数据:
private JSONObject jsonifyData() throws JSONException {
JSONArray jsonArray = new JSONArray();
// first we begin with array form
jsonArray.put(location.getLongitude());
jsonArray.put(location.getLatitude());
JSONObject mainObject = new JSONObject();
mainObject.put(LOC,jsonArray);
// here we put the rest of the data
for ( String loc_key : location.getKeys())
mainObject.put(loc_key, location.getParam(loc_key));
for ( String key : ApplicationData.commercial_keys) {
if ( !key.equalsIgnoreCase(ApplicationData.SERIAL) && comercial.containsKey(key))
mainObject.put(key, comercial.get(key));
}
mainObject.put(API_DEVICE, t_device);
mainObject.put(API_SCOPE, t_scope);
mainObject.put(API_OS, API_ANDROID);
String ip = "0.0.0.0";
mainObject.put(API_IP, ip); // IP de salida del sitio
return mainObject;
}
我为那个工作创建了这个方法。我认为这项工作没有困难,到时候我自己转换一下,但稍微修改一下你的。
然后,当你有 json 格式时,必须输入 headers 并发送数据:
try {
JSONObject data = jsonifyData();
Log.d(TAG, data.toString());
String[] HEAD = {"Content-Type"};
HashMap<String, String> cabeceras = new HashMap<>();
cabeceras.put("Content-Type", "application/json");
// you can ignore much of this
HttpRequest register = new HttpRequest(
'your_url',
null
);
register.setMethod("POST", 1);
register.setHeaders(HEAD, cabeceras);
register.setQuery(data.toString());
register.start();
register.join();
upload_data = true;
} catch (JSONException | MalformedURLException | InterruptedException e) {
e.printStackTrace();
}
}
如果你看到了,我使用的是 HttpRequest,它不是默认的!!我创建了一个同名的,这是POST:
的代码
private JSONObject POST() throws JSONException {
JSONObject response = null;
BufferedReader bufferedReader = null;
InputStreamReader in = null;
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) this.url.openConnection();
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
conn.setDoOutput(true);
conn.setRequestMethod(POST);
for (String KEY : KEYS) conn.setRequestProperty(KEY, headers.get(KEY));
conn.connect();
PrintWriter out = new PrintWriter(conn.getOutputStream());
out.print(postParameters);
Log.d("HttpRequest--->","DATA TO SEND: "+postParameters);
out.close();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
in = new InputStreamReader(conn.getInputStream());
bufferedReader = new BufferedReader(in);
String line;
StringBuilder buffer = new StringBuilder();
while ((line = bufferedReader.readLine()) != null) {
buffer.append(line);
buffer.append('\r');
}
bufferedReader.close();
in.close();
response = new JSONObject(buffer.toString());
}
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.disconnect();
}
if (bufferedReader != null) {
bufferedReader.close();
}
if (in != null) {
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return response;
}
我一直在尝试向服务器发送 JSON 数据。但是,我的努力失败了,因为 NameValuePair 已被弃用。 okHttp 给出了一些错误,例如 okie.string not found on library classpath。有人知道吗?请给我一些其他的技巧。我尝试了很多 Google 但是,这些文章没有帮助,因为文章太旧了。
任何链接或示例肯定会有帮助。
为此使用改造。 Retrofit Update
好的,这就是我所做的,我将编写自己的 HttpRequest 库,而不是默认库。如果你想使用这个代码,你必须做很多改变,但是指导我认为很好,以后我写的代码更好。
首先,您必须以这种方式json在 android 上验证您的数据:
private JSONObject jsonifyData() throws JSONException {
JSONArray jsonArray = new JSONArray();
// first we begin with array form
jsonArray.put(location.getLongitude());
jsonArray.put(location.getLatitude());
JSONObject mainObject = new JSONObject();
mainObject.put(LOC,jsonArray);
// here we put the rest of the data
for ( String loc_key : location.getKeys())
mainObject.put(loc_key, location.getParam(loc_key));
for ( String key : ApplicationData.commercial_keys) {
if ( !key.equalsIgnoreCase(ApplicationData.SERIAL) && comercial.containsKey(key))
mainObject.put(key, comercial.get(key));
}
mainObject.put(API_DEVICE, t_device);
mainObject.put(API_SCOPE, t_scope);
mainObject.put(API_OS, API_ANDROID);
String ip = "0.0.0.0";
mainObject.put(API_IP, ip); // IP de salida del sitio
return mainObject;
}
我为那个工作创建了这个方法。我认为这项工作没有困难,到时候我自己转换一下,但稍微修改一下你的。
然后,当你有 json 格式时,必须输入 headers 并发送数据:
try {
JSONObject data = jsonifyData();
Log.d(TAG, data.toString());
String[] HEAD = {"Content-Type"};
HashMap<String, String> cabeceras = new HashMap<>();
cabeceras.put("Content-Type", "application/json");
// you can ignore much of this
HttpRequest register = new HttpRequest(
'your_url',
null
);
register.setMethod("POST", 1);
register.setHeaders(HEAD, cabeceras);
register.setQuery(data.toString());
register.start();
register.join();
upload_data = true;
} catch (JSONException | MalformedURLException | InterruptedException e) {
e.printStackTrace();
}
}
如果你看到了,我使用的是 HttpRequest,它不是默认的!!我创建了一个同名的,这是POST:
的代码private JSONObject POST() throws JSONException {
JSONObject response = null;
BufferedReader bufferedReader = null;
InputStreamReader in = null;
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) this.url.openConnection();
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
conn.setDoOutput(true);
conn.setRequestMethod(POST);
for (String KEY : KEYS) conn.setRequestProperty(KEY, headers.get(KEY));
conn.connect();
PrintWriter out = new PrintWriter(conn.getOutputStream());
out.print(postParameters);
Log.d("HttpRequest--->","DATA TO SEND: "+postParameters);
out.close();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
in = new InputStreamReader(conn.getInputStream());
bufferedReader = new BufferedReader(in);
String line;
StringBuilder buffer = new StringBuilder();
while ((line = bufferedReader.readLine()) != null) {
buffer.append(line);
buffer.append('\r');
}
bufferedReader.close();
in.close();
response = new JSONObject(buffer.toString());
}
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.disconnect();
}
if (bufferedReader != null) {
bufferedReader.close();
}
if (in != null) {
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return response;
}