无法使用 Kotlin Retrofit 将数据从 Android 插入到 Mysql [重复]
Posted
技术标签:
【中文标题】无法使用 Kotlin Retrofit 将数据从 Android 插入到 Mysql [重复]【英文标题】:Unable To Insert Data From Android To Mysql Using Kotlin Retrofit [duplicate] 【发布时间】:2021-10-06 08:22:12 【问题描述】:我遇到的问题是我在 Android 应用上从 EditText 输入的数据不会发送到数据库
我使用 Retrofit 作为 HTTP 处理程序,使用 php 作为后端。
代码如下:
Retrofit.kt
package com.example.connecttomysql
import com.google.gson.GsonBuilder
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class Retrofit
fun getRetroClient() : Retrofit
val gson = GsonBuilder().setLenient().create()
return Retrofit.Builder().baseUrl("http://192.168.1.7/android/")
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
请求.kt
package com.example.connecttomysql
import com.google.gson.annotations.Expose
import com.google.gson.annotations.SerializedName
class Request
@SerializedName("name")
@Expose
var name: String? = null
用户响应.kt
package com.example.connecttomysql
import com.google.gson.annotations.Expose
import com.google.gson.annotations.SerializedName
class UserResponse
@SerializedName("error")
@Expose
var error: String? = null
@SerializedName("message")
@Expose
var message: String? = null
UserAPI.kt
package com.example.connecttomysql
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
interface UserAPI
@POST("config.php")
fun addName(@Body userRequest: Request) : Call<UserResponse>
MainActivity.kt
package com.example.connecttomysql
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.EditText
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class MainActivity : AppCompatActivity()
private lateinit var inputName : EditText
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
inputName = findViewById(R.id.addName)
findViewById<Button>(R.id.addNameButton).setOnClickListener addName()
private fun addName()
val request = Request()
request.name = inputName.text.toString()
val retro = Retrofit().getRetroClient().create(UserAPI::class.java)
retro.addName(request).enqueue(object : Callback<UserResponse>
override fun onResponse(call: Call<UserResponse>, response: Response<UserResponse>)
val user = response.body()
Log.e("Success", user?.error.toString())
Log.e("Success", user?.message.toString())
Log.e("Success", inputName.text.toString())
override fun onFailure(call: Call<UserResponse>, t: Throwable)
Log.e("Error", t.message.toString())
)
配置.php
<?php
$host = "localhost";
$username = "root";
$password = "";
$database = "android";
$connection = mysqli_connect($host,$username,$password,$database);
if(!$connection)
echo "Failed to connect to Mysql ". mysqli_connect_error();
$response = array();
if(isset($_POST['name']))
$name = $_POST['name'];
$query = mysqli_query($connection,"INSERT INTO user (name) VALUES ('$name')");
if($query)
$response['error'] = false;
$response['message'] = "Successfully added name to database";
else
$response['error'] = true;
$response['message'] = "Could not add data to database";
else
$response['error'] = true;
$response['message'] = "No name";
echo json_encode($response);
?>
来自 Android Logcat
2021-07-31 03:05:20.310 30371-30371/com.example.connecttomysql E/Success: true
2021-07-31 03:05:20.311 30371-30371/com.example.connecttomysql E/Success: No name
2021-07-31 03:05:20.311 30371-30371/com.example.connecttomysql E/Success: baee
从该日志看来,“名称”似乎没有从 Android 传递到 Config.php。这就是为什么它从 json 结果中显示“No name”。
我在这里错过了什么?
提前谢谢你
【问题讨论】:
不是当前问题,但您对 SQL 注入持开放态度。 (以后使用适当的缩进) 我认为这与您的PHP代码有关,请检查:***.com/a/40934656/8084314 【参考方案1】:您正在发送 body
并尝试接收 field
你可以在php端接收body:
<?php
$request = file_get_contents('php://input');
$request_json= json_decode($request , true);
$name = $request_json['name']
或(不推荐)
将改造部分更改为:
interface UserAPI
@FormUrlEncoded
@POST("config.php")
fun addName(@Field userRequest: Request) : Call<UserResponse>
然后您会在 php 中收到 Request
对象,其中包含 name
部分
【讨论】:
感谢您的帮助。现在解决了以上是关于无法使用 Kotlin Retrofit 将数据从 Android 插入到 Mysql [重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Retrofit 将 JsonArray 转换为 Kotlin 数据类(预期为 BEGIN_OBJECT 但为 BEGIN_ARRAY)
如何使用 Retrofit 2.0 (Kotlin) 正确解析嵌套的 JSON 对象?
如何使用 Retrofit Android Kotlin 发布 [重复]