HttpURLConnection PHP 脚本未获取数据
HttpURLConnection PHP script not getting data
我尝试了很多不同的方法来尝试使用 HttpURLConnection 将数据从我的 Android 应用程序上传到我服务器上的 PHP 脚本,但是在 PHP 在服务器上。我成功地使用了 HTTPClient,但我不得不切换到使用 HttpURLConnection。该应用程序在 运行 时不会崩溃。我确信我忽略了一些简单的事情。我的 PHP 脚本工作正常,甚至 returns 预期的响应,但我还没有发现我的 Android 代码有问题。感谢任何帮助。
这是 PHP 脚本的开头:
$data = $_POST["deviceSIG"];
这是我用来将数据上传到 PHP 脚本的代码:
// the string deviceSIG is defined elsewhere and has been defined in the class.
private class MyAsyncTask extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... params)
try{
URL url = new URL("http://192.168.10.199/user_script.php");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
OutputStream outputStream = conn.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");
writer.write(deviceSIG);
writer.close();
outputStream.close();
// read response
BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) { response.append(inputLine); }
in.close();
result = response.toString();
// disconnect
conn.disconnect();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
//-------------------------------------------------------------------------------
protected void onProgressUpdate(Integer... progress){
progBar.setProgress(progress[0]);
}
//-------------------------------------------------------------------------------
protected void onPostExecute(String result){
progBar.setVisibility(View.GONE);
String rawEcho = result;
String[] Parts = rawEcho.split("~");
String echo = Parts[1];
String UIID = "User ID: " + echo;
try {
FileOutputStream fOS = openFileOutput("Info.txt", Context.MODE_APPEND);
fOS.write(newLine.getBytes());
fOS.write(UIID.getBytes());
fOS.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Android 6.0建议使用HttpURLConnection发送HTTP请求,我在GitHub上Android的食谱书上做了一个示例项目:
https://github.com/xinmeng1/HttpUrlConnectionREST
其中包括发送 GET/POST(表单数据或多部分)HTTP 请求。如果你需要这本书,我可以把HttpURLConnection的使用相关的章节发过来。
经过大约 20 天的搜索和测试,我有了一个可行的解决方案。 Android 和 Oracle 都应该 post 编写一个像这样的简单注释示例,它会为我和其他人节省很多时间。
感谢 Xin Meng 在此 post 上为我指明了有关 "the header, the content, the format of the request" 使用的正确方向。
感谢 jmort253 在 上的代码和他 post 编辑的解释(当然,我修改了他的代码以适合我的项目)。
我现在是一个更好的程序员,因为我花时间试图理解为什么我的原始代码失败了。
下面是我的注释代码,它适用于 post 我的 PHP 脚本的文本字符串,我希望它能帮助遇到麻烦的其他人。如果有人看到有待改进的地方,请 post 发表评论。:
PHP 一方:
$data = $_POST["values"]; // this gets the encoded and formatted string from the Android app.
Android 方:
import java.net.HttpURLConnection;
// from another place in my code, I used:
// This calls the AsyncTask class below.
new POSTAsyncTask().execute();
//--------------------------------------------------
private class POSTAsyncTask extends AsyncTask<String, Integer, String>{
// AsyncTask<Params, Progress, Result>.
// Params – the type (Object/primitive) you pass to the AsyncTask from .execute()
// Progress – the type that gets passed to onProgressUpdate()
// Result – the type returns from doInBackground()
@Override
protected String doInBackground(String... params) {
String phpPOST = null; // make sure this variable is empty
try {
// deviceSIG is defined in another part of the code, and is a text string of values.
// below, the contents of deviceSIG are encoded and populated into the phpPOST variable for POSTing.
// the LACK of encoding was one reason my previous POST attempts failed.
phpPOST = URLEncoder.encode(deviceSIG, "UTF-8");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
// Populate the URL object with the location of the PHP script or web page.
URL url = new URL("http://192.168.10.199/user_script.php");
// This is the point where the connection is opened.
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// "(true)" here allows the POST action to happen.
connection.setDoOutput(true);
// I will use this to get a string response from the PHP script, using InputStream below.
connection.setDoInput(true);
// set the request method.
connection.setRequestMethod("POST");
// This is the point where you'll know if the connection was
// successfully established. If an I/O error occurs while creating
// the output stream, you'll see an IOException.
OutputStreamWriter writer = new OutputStreamWriter(
connection.getOutputStream());
// write the formatted string to the connection.
// "values=" is a variable name that is passed to the PHP script.
// The "=" MUST remain on the Android side, and MUST be removed on the PHP side.
// the LACK of formatting was another reason my previous POST attempts failed.
writer.write("values=" + phpPOST);
// Close the output stream and release any system resources associated with this stream.
// Only the outputStream is closed at this point, not the actual connection.
writer.close();
//if there is a response code AND that response code is 200 OK, do stuff in the first if block
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
// OK
// otherwise, if any other status code is returned, or no status
// code is returned, do stuff in the else block
} else {
// Server returned HTTP error code.
}
// Get the string response from my PHP script:
InputStream responseStream = new
BufferedInputStream(connection.getInputStream());
BufferedReader responseStreamReader =
new BufferedReader(new InputStreamReader(responseStream));
String line = "";
StringBuilder stringBuilder = new StringBuilder();
while ((line = responseStreamReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
responseStreamReader.close();
String response = stringBuilder.toString();
// Close response stream:
responseStream.close();
result = response.toString();
// Disconnect the connection:
connection.disconnect();
//--------------------------------
} catch (MalformedURLException e) {
// ...
} catch (IOException e) {
// ...
}
return result; // when I had this as 'return null;', I would get a NullPointerException in String that equaled the result variable.
}
我尝试了很多不同的方法来尝试使用 HttpURLConnection 将数据从我的 Android 应用程序上传到我服务器上的 PHP 脚本,但是在 PHP 在服务器上。我成功地使用了 HTTPClient,但我不得不切换到使用 HttpURLConnection。该应用程序在 运行 时不会崩溃。我确信我忽略了一些简单的事情。我的 PHP 脚本工作正常,甚至 returns 预期的响应,但我还没有发现我的 Android 代码有问题。感谢任何帮助。
这是 PHP 脚本的开头:
$data = $_POST["deviceSIG"];
这是我用来将数据上传到 PHP 脚本的代码:
// the string deviceSIG is defined elsewhere and has been defined in the class.
private class MyAsyncTask extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... params)
try{
URL url = new URL("http://192.168.10.199/user_script.php");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
OutputStream outputStream = conn.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");
writer.write(deviceSIG);
writer.close();
outputStream.close();
// read response
BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) { response.append(inputLine); }
in.close();
result = response.toString();
// disconnect
conn.disconnect();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
//-------------------------------------------------------------------------------
protected void onProgressUpdate(Integer... progress){
progBar.setProgress(progress[0]);
}
//-------------------------------------------------------------------------------
protected void onPostExecute(String result){
progBar.setVisibility(View.GONE);
String rawEcho = result;
String[] Parts = rawEcho.split("~");
String echo = Parts[1];
String UIID = "User ID: " + echo;
try {
FileOutputStream fOS = openFileOutput("Info.txt", Context.MODE_APPEND);
fOS.write(newLine.getBytes());
fOS.write(UIID.getBytes());
fOS.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Android 6.0建议使用HttpURLConnection发送HTTP请求,我在GitHub上Android的食谱书上做了一个示例项目:
https://github.com/xinmeng1/HttpUrlConnectionREST
其中包括发送 GET/POST(表单数据或多部分)HTTP 请求。如果你需要这本书,我可以把HttpURLConnection的使用相关的章节发过来。
经过大约 20 天的搜索和测试,我有了一个可行的解决方案。 Android 和 Oracle 都应该 post 编写一个像这样的简单注释示例,它会为我和其他人节省很多时间。
感谢 Xin Meng 在此 post 上为我指明了有关 "the header, the content, the format of the request" 使用的正确方向。
感谢 jmort253 在 上的代码和他 post 编辑的解释(当然,我修改了他的代码以适合我的项目)。
我现在是一个更好的程序员,因为我花时间试图理解为什么我的原始代码失败了。
下面是我的注释代码,它适用于 post 我的 PHP 脚本的文本字符串,我希望它能帮助遇到麻烦的其他人。如果有人看到有待改进的地方,请 post 发表评论。:
PHP 一方:
$data = $_POST["values"]; // this gets the encoded and formatted string from the Android app.
Android 方:
import java.net.HttpURLConnection;
// from another place in my code, I used:
// This calls the AsyncTask class below.
new POSTAsyncTask().execute();
//--------------------------------------------------
private class POSTAsyncTask extends AsyncTask<String, Integer, String>{
// AsyncTask<Params, Progress, Result>.
// Params – the type (Object/primitive) you pass to the AsyncTask from .execute()
// Progress – the type that gets passed to onProgressUpdate()
// Result – the type returns from doInBackground()
@Override
protected String doInBackground(String... params) {
String phpPOST = null; // make sure this variable is empty
try {
// deviceSIG is defined in another part of the code, and is a text string of values.
// below, the contents of deviceSIG are encoded and populated into the phpPOST variable for POSTing.
// the LACK of encoding was one reason my previous POST attempts failed.
phpPOST = URLEncoder.encode(deviceSIG, "UTF-8");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
// Populate the URL object with the location of the PHP script or web page.
URL url = new URL("http://192.168.10.199/user_script.php");
// This is the point where the connection is opened.
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// "(true)" here allows the POST action to happen.
connection.setDoOutput(true);
// I will use this to get a string response from the PHP script, using InputStream below.
connection.setDoInput(true);
// set the request method.
connection.setRequestMethod("POST");
// This is the point where you'll know if the connection was
// successfully established. If an I/O error occurs while creating
// the output stream, you'll see an IOException.
OutputStreamWriter writer = new OutputStreamWriter(
connection.getOutputStream());
// write the formatted string to the connection.
// "values=" is a variable name that is passed to the PHP script.
// The "=" MUST remain on the Android side, and MUST be removed on the PHP side.
// the LACK of formatting was another reason my previous POST attempts failed.
writer.write("values=" + phpPOST);
// Close the output stream and release any system resources associated with this stream.
// Only the outputStream is closed at this point, not the actual connection.
writer.close();
//if there is a response code AND that response code is 200 OK, do stuff in the first if block
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
// OK
// otherwise, if any other status code is returned, or no status
// code is returned, do stuff in the else block
} else {
// Server returned HTTP error code.
}
// Get the string response from my PHP script:
InputStream responseStream = new
BufferedInputStream(connection.getInputStream());
BufferedReader responseStreamReader =
new BufferedReader(new InputStreamReader(responseStream));
String line = "";
StringBuilder stringBuilder = new StringBuilder();
while ((line = responseStreamReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
responseStreamReader.close();
String response = stringBuilder.toString();
// Close response stream:
responseStream.close();
result = response.toString();
// Disconnect the connection:
connection.disconnect();
//--------------------------------
} catch (MalformedURLException e) {
// ...
} catch (IOException e) {
// ...
}
return result; // when I had this as 'return null;', I would get a NullPointerException in String that equaled the result variable.
}