【发布时间】:2015-11-13 14:19:59
【问题描述】:
我编写了一个代码来接收来自 android 客户端的 POST 变量。在Android端发出POST请求时,PHP会接收到每个变量并进行下一步处理。
<?php
if (isset($_POST['tag']) && !empty($_POST['tag'])) {
$tag = $_POST['tag'];
// get the variables.
$name = $_POST['name'];
$email = $_POST['email'];
$password = $_POST['password'];
// response Array
$response = array();
require_once 'mysql/DB_Functions.php';
$db = new DB_Functions();
// check for tag type
if ($tag == 'login') {
// check for user
$user = $db->getUserByEmailAndPassword($email, $password);
if ($user != false) {
// user found
$response["error"] = FALSE;
$response["uid"] = $user["unique_id"];
$response["user"]["name"] = $user["name"];
$response["user"]["email"] = $user["email"];
$response["user"]["created_at"] = $user["created_at"];
$response["user"]["updated_at"] = $user["updated_at"];
echo json_encode($response);
} else {
// user not found
// echo json with error = 1
$response["error"] = TRUE;
$response["error_msg"] = "Incorrect email or password!";
echo json_encode($response);
}
} else if ($tag == 'register') {
// check if user is already exists
if ($db->userExists($email)) {
// user already exists - error response
$response["error"] = TRUE;
$response["error_msg"] = "User already exists";
echo json_encode($response);
} else {
// store user
$user = $db->storeUser($name, $email, $password);
if ($user) {
// user successfully saved to MySQL database.
$response["error"] = FALSE;
$response["uid"] = $user["unique_id"];
$response["user"]["name"] = $user["name"];
$response["user"]["email"] = $user["email"];
$response["user"]["created_at"] = $user["created_at"];
$response["user"]["updated_at"] = $user["updated_at"];
echo json_encode($response);
} else {
// user failed to store
$response["error"] = TRUE;
$response["error_msg"] = "Error occured in Registartion";
echo json_encode($response);
}
}
} else {
// user failed to store
$response["error"] = TRUE;
$response["error_msg"] = "Unknow 'tag' value. It should be either 'login' or 'register'";
echo json_encode($response);
}
} else {
$response["error"] = TRUE;
$response["error_msg"] = "Operation failed due to the missing tag!";
echo json_encode($response);
}
var_dump($_SERVER['REQUEST_METHOD'], $_POST);
?>
但是当我在网络上打开这个原始 PHP 文件并查看它的外观时,我发现了一些非常奇怪的东西。它说如下。
{"error":true,"error_msg":"Operation failed due to the missing tag!"}string(3) "GET" array(0) { }
那个“GET”是我认为很奇怪的那个,因为在 PHP 或 Android 端我从未使用过 GET 方法,它存在于浏览器中。这是怎么发生的?我必须做些什么才能将其更改为 POST?
编辑:
这是请求 POST 方法的 Android 部分。此处使用 Volley 库。
Map<String, String> params = new HashMap<>();
params.put("tag", "register");
params.put("name", name);
params.put("email", email);
params.put("password", password);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Method.POST, ServerURL.URL_REGISTER, new JSONObject(params), new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG_REGISTER, "Register Response: " + response.toString());
pDialog.dismiss();
try {
JSONObject jObj = new JSONObject(response.toString());
boolean error = jObj.getBoolean("error");
if (!error) {
// User successfully stored in MySQL
// Now store the user in sqlite
String uid = jObj.getString("uid");
JSONObject user = jObj.getJSONObject("user");
String name = user.getString("name");
String email = user.getString("email");
String created_at = user
.getString("created_at");
// Inserting row in users table
db.addUserIntoSQLite(name, email, uid, created_at);
Toast.makeText(getActivity(), "User successfully registered. Try login now!", Toast.LENGTH_LONG).show();
// Launch main activity
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
getActivity().overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
startActivity(intent);
getActivity().finish();
} else {
// Error occurred in registration. Get the error
// message
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getActivity(), errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
Toast.makeText(getActivity(), "JSONException: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG_REGISTER, "Registration Error: " + error.getMessage());
Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_LONG).show();
pDialog.dismiss();
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
};
RequestQueue queue = Volley.newRequestQueue(getActivity());
queue.add(jsonObjectRequest);
}
【问题讨论】:
-
你能显示发出这个请求的代码吗?是android还是html?
-
GET是请求方法。如果您在浏览器中正常打开此文件,它是使用GET方法打开的,您在输出中看到的原因是var_dump($_SERVER['REQUEST_METHOD'], $_POST);。 (请注意,它不仅仅是"GET"本身,整个string(3) "GET"属于一起)。另外,如果你var_dump($_GET),你得到了什么,还是和$_POST一样是空的? -
看起来参数根本没有传递给脚本。显示提交数据的表单的源代码。
-
@DarylGill 我上传了 Android 部分。谢谢
-
@ROAL 每当我向服务器发送带有标签的请求时,我什么都没有收到,所以它总是返回标签丢失。
标签: php android post android-volley