Модернизация POST с jsonObject не загружается - PullRequest
0 голосов
/ 10 июля 2020

Я работаю над этим уже несколько часов и не добился никакого прогресса. Я новичок в модернизации и в основном просто пытаюсь сделать простой почтовый запрос с помощью jsonObject, но получаю эту ошибку:

java.lang.illegalStateException: Expected BEGIN_OBJECT but was STRING at line 
1 column 1 path $

Я пытался изменить практически каждый бит этого кода от клиента на использование multipart или requestBody и даже мой код php, но ничего не работает, также попытался повторить ввод в скрипте, но он выводит пустой. Мы очень ценим любой ответ, спасибо.

Интерфейс

interface ApiInterface {
    @Headers("Content-Type: application/json")
    @POST(BuildConfig.URL_REGISTER)
    fun signUpUser(@Body jsonObject: JSONObject): Call<Response>
}

Ответ

data class Response(@SerializedName("success") val success: Boolean,
    @SerializedName("message") val message: String,
    @SerializedName("userId") val userId:String)

Клиент

class ApiClient {

private external fun register(): String

companion object {
    // Used to load the 'native-lib' library on application startup.
    init {
        System.loadLibrary("native-lib")
    }
}

private val okhttpClient = OkHttpClient.Builder().build()

private val gson: Gson = GsonBuilder()
    .setLenient()
    .create()

val instance: ApiInterface by lazy {
    val  retrofit = Retrofit.Builder()
        .baseUrl(register())
        .addConverterFactory(GsonConverterFactory.create(gson))
        .client(okhttpClient)
        .build()
    retrofit.create(ApiInterface::class.java)
}

Запрос

val jsonObject = JSONObject()
    jsonObject.put("username", username)
    jsonObject.put("password", password)
    jsonObject.put("email", email)
    jsonObject.put("termsOfService", termsOfService)
    jsonObject.put("profilePicPath", imagePath)

ApiClient().instance.signUpUser(jsonObject).enqueue(object: Callback<com.passionit.picnbuy.models.Response>{
    override fun onFailure(
        call: Call<com.passionit.picnbuy.models.Response>, t: Throwable) {
            Toast.makeText(this@LoginOrSignUpActivity, t.message, Toast.LENGTH_LONG).show()
        }

    override fun onResponse(call: Call<com.passionit.picnbuy.models.Response>, response: Response<com.passionit.picnbuy.models.Response>) {
        Toast.makeText(this@LoginOrSignUpActivity, response.message(), Toast.LENGTH_LONG).show()
        if (response.body()!!.success) { //success, now uploading pfp
            //successful response doing stuff...
        } else { 
            //error caught in script file
        }
    }

})

Php файл

<?php
$inputJSON = file_get_contents('php://input');
$input = json_decode($inputJSON, TRUE);

$conn = new mysqli("localhost", "root", "", "database");

if ($conn->connect_error) {
    die("Failed to connect: " . $conn->connect_error);
}

$username = $input["username"];
$password = $input["password"];
$email = $input["email"];
$termsOfService = $input["termsOfService"];
$profilePicPath = $input["profilePicPath"];

//converting data
$termsOfService = $termsOfService ? 'true' : 'false';

//Username check
$usernameCheckQuery = $conn->prepare("SELECT * FROM allUsers WHERE username = ?");
$usernameCheckQuery->bind_param("s", $username);
$usernameCheckQuery->execute(); 

if ($usernameCheckQuery->num_rows > 0) {//username exists
    $usernameCheckQuery->close();

    print(json_encode(array('success' => false, 'message' => "username already exists")));

} else {
    $usernameCheckQuery->close();

    password_hash($password, PASSWORD_DEFAULT);
    $query = $conn->prepare("INSERT INTO allUsers(username, password, email, tOS, pfPPath) 
        VALUES(?, ?, ?, ?, ?)");
    $query->bind_param("sssss", $username, $password, $email, $termsOfService, $profilePicPath);
    $query->execute();
    $query->close();
    print(json_encode(array('success' => true)));
}

$conn->close();
json_last_error();
?>

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Я обнаружил, что отправка чего-либо, кроме массива или поля, по какой-то причине добавляла лишние символы при получении в php, в итоге я просто использовал такие поля.

interface ApiInterface {
@FormUrlEncoded
@POST(BuildConfig.URL_REGISTER)
fun signUpUser(@Field("username") username: String,
               @Field("password") password: String,
               @Field("email") email: String,
               @Field("termsOfService") termsOfService: Boolean,
               @Field("profilePicPath") profilePicPath: String): Call<Response>

}

а в php его получили вот так

$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
$termsOfService = $_POST['termsOfService'];
$profilePicPath = $_POST['profilePicPath'];
0 голосов
/ 10 июля 2020

дорогой друг. Я предлагаю добавить следующие две строки в файл build.gradle.

    // Logging Interceptor
    implementation "com.squareup.okhttp3:logging-interceptor:4.7.2"
    implementation 'org.conscrypt:conscrypt-android:2.4.0'

И использовать его, как показано ниже


object ApiServiceContainer {
    private var apiService: ApiService? = null
    fun getApiService(): ApiService {
        if (apiService == null) {
            val logging = HttpLoggingInterceptor()
            logging.level = HttpLoggingInterceptor.Level.BODY
            val httpClient = OkHttpClient.Builder()
            httpClient.addInterceptor { chain ->
                val original = chain.request()
                val requestBuilder = original.newBuilder()
                    .header("Authorization", "Bearer " + token)
                    .header("Accept", "application/json")
                    .header("Content-Type", "application/json")
                val request = requestBuilder.build()
                chain.proceed(request)
            }
            httpClient.connectTimeout(30, TimeUnit.SECONDS)
            httpClient.readTimeout(30, TimeUnit.SECONDS)
            httpClient.addNetworkInterceptor(logging)
            val okHttpClient = httpClient.build()
            val gson = GsonBuilder()
                .setLenient()
                .create()
            val retrofit = Retrofit.Builder()
                .baseUrl(EndPoints.API_BASE_URL)
                .addConverterFactory(
                    GsonConverterFactory.create(gson)
                )
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(okHttpClient)
                .build()
            apiService = retrofit.create(ApiService::class.java)
        }
        return apiService!!
    }

Чтобы вы могли видеть ошибки, выдаваемые сервером.

...