$_POST 请求适用于邮递员,但不适用于 android 应用
$_POST request works with postman but not in android app
我在这个问题上已经有一段时间了,目前正在尝试将我的 php 脚本转换为 PDO,但是当 运行 通过 isset() 时 $_POST 总是给我 null。我在 android 中的代码与我的其他脚本一起工作正常,但是当我将每个项目的 $_POST 更改为 $_REQUEST 并且链接看起来也不同时,这个代码只在 postman 中工作。还值得一提的是,onResponse 和 onFailure 不是 receiving/printing 的任何消息。
邮递员URL
http://123.456.7.89/Database/register.php?username=asdfasdf&password=lj4ioidfoislkjsf&email=jalenpauloiudf&tece=true&profilePicPath=aksdfjlakjdsfl&tokenId=as89gwbeg98sd
当前URL
http://123.456.7.89/Database/register.php
脚本
<?php
$servername = "localhost";
$dbUsername = "root";
$dbPassword = "password";
$dbname = "Database";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $dbUsername, $dbPassword);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
$termsOfService = $_POST['termsOfService'];
$profilePicPath = $_POST['profilePicPath'];
$tokenId = $_POST['tokenId'];
$userId = uniqId();
//converting data
$termsOfService = $termsOfService ? 'true' : 'false';
//Username check
$emailForQuery = "%" . $_POST['email'] . "%";
$userIdForQuery = "%" . $userId . "%";
$usernameCheckQuery = $conn->prepare("SELECT email, userId FROM users WHERE email LIKE ? OR userId LIKE ? LIMIT 1");
$usernameCheckQuery->execute([$emailForQuery, $userIdForQuery]);
$usernameCheckQuery->fetch();
if ($usernameCheckQuery->rowCount() == 0) {//username doesnt exist
$usernameCheckQuery->closeCursor();
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
$query = $conn->prepare("INSERT INTO users(userId, username, password, email, termsOfService, profilePicPath, tokenId)
VALUES(?, ?, ?, ?, ?, ?, ?)");
$query->execute([$userId, $username, $hashedPassword, $email, $termsOfService, $profilePicPath, $tokenId]);
$query->closeCursor();
header('Content-type:application/json;charset=utf-8');
$resArray = ['success' => true, 'userId' => $userId];
echo json_encode($resArray);
} else { //username exists
$usernameCheckQuery->closeCursor();
connectionError("username already exists");
}
} catch(PDOException $e) {
connectionError();
}
function connectionError($message = "database connection error") { //sending response
header('Content-type:application/json;charset=utf-8');
$resArray = ['success' => false, 'message' => $message];
echo json_encode($resArray);
$conn = null;
}
?>
Androidpost数据
@FormUrlEncoded
@POST("register.php")
fun signUpUser(@Field("username") username: String,
@Field("password") password: String,
@Field("email") email: String,
@Field("termsOfService") termsOfService: Boolean,
@Field("profilePicPath") profilePicPath: String,
@Field("tokenId") tokenId: String): Call<ResponseLoginOrSignUp>
我的猜测是它与 urls 有关,但又没有发送响应。
如果需要任何额外的代码,请告诉我并添加,谢谢。
回答!!!
这是我的结论,我有一个不安全的域,需要将 ssl 添加到我的托管域以及自定义域。对于 ssl,我为所有寻找免费 ssl 的人使用了 cloudflare,因为我花了一段时间才找到合适的站点。在 android studio
中展示的 url 中也将 http 切换为 https
在 android 清单中使用
android:usesCleartextTraffic="真"
首先,尝试将 Http
更改为 https
那我推荐使用android volley to post requests
https://developer.android.com/training/volley[Android volley example]1
我在这个问题上已经有一段时间了,目前正在尝试将我的 php 脚本转换为 PDO,但是当 运行 通过 isset() 时 $_POST 总是给我 null。我在 android 中的代码与我的其他脚本一起工作正常,但是当我将每个项目的 $_POST 更改为 $_REQUEST 并且链接看起来也不同时,这个代码只在 postman 中工作。还值得一提的是,onResponse 和 onFailure 不是 receiving/printing 的任何消息。
邮递员URL
http://123.456.7.89/Database/register.php?username=asdfasdf&password=lj4ioidfoislkjsf&email=jalenpauloiudf&tece=true&profilePicPath=aksdfjlakjdsfl&tokenId=as89gwbeg98sd
当前URL
http://123.456.7.89/Database/register.php
脚本
<?php
$servername = "localhost";
$dbUsername = "root";
$dbPassword = "password";
$dbname = "Database";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $dbUsername, $dbPassword);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
$termsOfService = $_POST['termsOfService'];
$profilePicPath = $_POST['profilePicPath'];
$tokenId = $_POST['tokenId'];
$userId = uniqId();
//converting data
$termsOfService = $termsOfService ? 'true' : 'false';
//Username check
$emailForQuery = "%" . $_POST['email'] . "%";
$userIdForQuery = "%" . $userId . "%";
$usernameCheckQuery = $conn->prepare("SELECT email, userId FROM users WHERE email LIKE ? OR userId LIKE ? LIMIT 1");
$usernameCheckQuery->execute([$emailForQuery, $userIdForQuery]);
$usernameCheckQuery->fetch();
if ($usernameCheckQuery->rowCount() == 0) {//username doesnt exist
$usernameCheckQuery->closeCursor();
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
$query = $conn->prepare("INSERT INTO users(userId, username, password, email, termsOfService, profilePicPath, tokenId)
VALUES(?, ?, ?, ?, ?, ?, ?)");
$query->execute([$userId, $username, $hashedPassword, $email, $termsOfService, $profilePicPath, $tokenId]);
$query->closeCursor();
header('Content-type:application/json;charset=utf-8');
$resArray = ['success' => true, 'userId' => $userId];
echo json_encode($resArray);
} else { //username exists
$usernameCheckQuery->closeCursor();
connectionError("username already exists");
}
} catch(PDOException $e) {
connectionError();
}
function connectionError($message = "database connection error") { //sending response
header('Content-type:application/json;charset=utf-8');
$resArray = ['success' => false, 'message' => $message];
echo json_encode($resArray);
$conn = null;
}
?>
Androidpost数据
@FormUrlEncoded
@POST("register.php")
fun signUpUser(@Field("username") username: String,
@Field("password") password: String,
@Field("email") email: String,
@Field("termsOfService") termsOfService: Boolean,
@Field("profilePicPath") profilePicPath: String,
@Field("tokenId") tokenId: String): Call<ResponseLoginOrSignUp>
我的猜测是它与 urls 有关,但又没有发送响应。
如果需要任何额外的代码,请告诉我并添加,谢谢。
回答!!! 这是我的结论,我有一个不安全的域,需要将 ssl 添加到我的托管域以及自定义域。对于 ssl,我为所有寻找免费 ssl 的人使用了 cloudflare,因为我花了一段时间才找到合适的站点。在 android studio
中展示的 url 中也将 http 切换为 https在 android 清单中使用 android:usesCleartextTraffic="真"
首先,尝试将 Http
更改为 https
那我推荐使用android volley to post requests
https://developer.android.com/training/volley[Android volley example]1