我需要从Android应用程序传递登录/注册数据到Localhost上的MySQL数据库。我仍在学习过程中,并且上周对此有问题。我读了数十页,问题&堆栈上的答案溢出并尝试了所有内容,但我只是无法正常工作。您能在我的代码中指出我的问题吗?
Android,Activity&ASYNCTASK类:
package com.example.mario.datadrivenassignmenttwo;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
public class DbManager extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.register);
}
public void register(View v) {
EditText uname = (EditText) findViewById(R.id.username);
EditText pw = (EditText) findViewById(R.id.password);
String username = uname.getText().toString();
System.out.println("username is: " + username);
String password = pw.getText().toString();
System.out.println("password is: " + password);
Uploader task = new Uploader();
task.execute(new String[] { "http://10.0.2.2/user_db/senddata.php", username, password });
}
public class Uploader extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
/*
String response = "Finished";
try {
postHttpContent(params[0],params[1],params[2]);
} catch (IOException e) {
Log.e("error", e.toString());
}
return response;
*/
try {
String urlParam = params[0];
String username = params[1];
String password = params[2];
String charset = java.nio.charset.StandardCharsets.UTF_8.name();
String query = String.format("username=%s&password=%s", URLEncoder.encode(username, charset), URLEncoder.encode(password, charset));
/*
URLConnection conn = new URL(urlParam).openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Accept-Charset", charset);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
OutputStream output = conn.getOutputStream();
output.write(query.getBytes(charset));
output.flush();
output.close();
*/
URL url = new URL(urlParam);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(query);
writer.close();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
System.out.println("It's ok!");
System.out.println(query);
} else {
System.out.println("Error code there");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "Finished";
}
@Override
protected void onPostExecute(String result) {
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
}
}
}
和我的php:
<?php
// connect to database
$hostname = "localhost";
$username = "root";
$password = "root";
$dbname = "user_db";
$link = new mysqli($hostname, $username, $password, $dbname);
// get the JSONArray the app sends
$contents = file_get_contents('php://input');
$jsonArray = json_decode($contents, true);
$jsonCount = count($jsonArray);
for ($i = 0; $i < $jsonCount; $i++) {
$item = $jsonArray[$i];
$itemUsername = utf8_decode($item['username']);
$itemPassword = utf8_decode($item['password']);
// parse the other json attributes here like the one above
$sql = "INSERT INTO users (username, password) VALUES ('$itemUsername', '$itemPassword')";
if ($link->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $link->error;
}
}
$link->close();
?>
有很多评论的代码,这就是我尝试的,还有其他一些代码,但没有任何作用。我还尝试将所有连接放在一个方法中,并将该方法称为Asynctask类中,但失败了。由于我不知道PHP,因此我不确定问题是否在我的Android代码或PHP文件中。
许多事先感谢。
首先,您需要了解错误代码。通常,400中的错误代码意味着您以某种方式击中服务器,但是您仅限于访问资源,或者只是通过提供错误的数据来提出不良请求。在500年代,错误通常是严重错误。这表明您的服务器代码存在问题。虽然请注意,因为了解这一点很重要。在本地主机中进行测试时,您需要将IP公开以使服务器是处理请求的否则,您将无法击中本地主机服务器。如果您是Ngrok等新手结帐工具,将帮助您更快地曝光IP,以便完成API。欢呼雀跃!
我在10分钟前就发现了它。我正在发布新的代码,并且可以正常工作。
package com.example.korisnik.test;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class DbManager extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.register);
}
public void register(View v) {
EditText uname = (EditText) findViewById(R.id.username);
EditText pw = (EditText) findViewById(R.id.password);
String username = uname.getText().toString();
String password = pw.getText().toString();
System.out.println("Username is: " + username + " ,and password is: " + password);
Uploader task = new Uploader();
task.execute(new String[] { "http://10.0.2.2/user_db/senddata.php", username, password });
}
public class Uploader extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
String response = null;
try {
response += postHttpContent(params[0],params[1],params[2]);
} catch (IOException e) {
System.out.println("IO Error");
Log.e("error", e.toString());
} catch (JSONException e) {
System.out.println("JSON Error");
e.printStackTrace();
}
return response;
}
@Override
protected void onPostExecute(String result) {
System.out.println(result);
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
}
public String postHttpContent(String urlStr, String user, String pass) throws IOException, JSONException {
String response = "";
URL url = new URL(urlStr);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
httpConn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
httpConn.setRequestMethod("POST");
JSONObject userdata = new JSONObject();
userdata.put("username",user);
userdata.put("password", pass);
JSONArray data = new JSONArray();
data.put(userdata);
System.out.println("Array is: " + data);
try {
DataOutputStream localDataOutputStream = new DataOutputStream(httpConn.getOutputStream());
localDataOutputStream.writeBytes(data.toString());
localDataOutputStream.flush();
localDataOutputStream.close();
System.out.println("Data writting: " + data);
} catch (IOException e) {
e.printStackTrace();
System.out.println("Data Output error");
}
int responseCode = httpConn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));
do {
line = br.readLine();
response += line;
} while ((line = br.readLine()) != null);
} else {
response = "Error ";
throw new IOException();
}
return response + " * Uploaded!";
}
}
}
我使用了jsonobject,并将用户名和密码的密钥/值对放入其中。比我将jsonobject放在jsonarray中(我知道这只是一个jsonobject,而我不必将其放入JSONARRAY中,但是由于我的PHP代码是为JSONARRAY设计的,我对PHP不好,我想知道将jsonobject放入jsonarray要比更改我不太了解的PHP代码容易。
第二个更改是使用" dataoutputstream"而不是" outputStreamWriter"。