Не можете отправить данные через POST с помощью Retrofit? - PullRequest
1 голос
/ 12 апреля 2020

Я столкнулся с проблемой, во-первых, я новичок в android, и у меня есть запрос Post, я отправляю объект в теле:

public class SingleContractRequest {
    @SerializedName("userRole")
    private String userRole;
    @SerializedName("contratId")
    private String contratId;

    public SingleContractRequest(String userRole, String contractId) {
        this.userRole = userRole;
        this.contratId = contractId;
    }

    public String getUserRole() {
        return userRole;
    }

    public void setUserRole(String userRole) {
        this.userRole = userRole;
    }

    public String getContractId() {
        return contratId;
    }

    public void setContractId(String contractId) {
        this.contratId = contractId;
    }
}

И это мой ContractApi вызываемый метод является вторым:

public interface ContractApi {

    @GET("contrats.php")
    Single<List<ContractModel>> getContractList();

    @POST("contrat.php")
    Single<ContractModel> getContract(@Body SingleContractRequest body);

}

А вот мой модуль:

@Module
public class ApiModule {

    public static String BASE_URL = "http://192.168.1.104/newconceptsphp/";

    @Provides
    public ContractApi provideContractApi(){
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();

        return new Retrofit.Builder().baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build()
                .create(ContractApi.class);
    }

    @Provides
    public ContractService provideContractService(){
        return ContractService.getInstance();
    }

}

И для вызова API у меня есть метод в моей службе:

public Single<ContractModel> getContract(SingleContractRequest request) {
     return api.getContract(request);
}

Так что я мог бы сделать это одним единственным способом, но я создаю много слоев для лучшей архитектуры.

Ошибка, которую я получаю сейчас, и я не знаю, как ее решить:

com.google.gson.JsonSyntaxException: java .lang.IllegalStateException: ожидалось BEGIN_OBJECT, но было STRING в пути строки 1 столбца 1 $ в com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter. читать (ReflectiveTypeAdapterFactory. java: 224) по адресу retrofit2.converter.gson.GsonResponseBodyConverter.convert (GsonResponseBodyConverter. java: 37)

Это сценарий, который я использую:

<?php 


header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header("Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description");

json_decode(file_get_contents("php://input"), true);

$dsn = "mysql:host=localhost;dbname=leranconcepts";
$user = "root";
$passwd = "";

$pdo = new PDO($dsn, $user, $passwd);


if (isset($_POST["userRole"])){
    $userRole = $_POST["userRole"];
} else {
    $userRole = null;
}
if (isset($_POST["contratId"])){
    $contratId = $_POST["contratId"];
} else {
    $contratId = null;
}

// managing products 

if ($userRole === "VENDEUR"){
    $sth = $pdo->prepare("SELECT * FROM contrat WHERE id=?");
} else if($userRole === "COURTIER"){
    $sth = $pdo->prepare("SELECT id, imageUrl, courtier FROM contrat WHERE id=?");
}

$sth->execute([$contratId]);

$result = $sth->fetchAll(PDO::FETCH_OBJ);


echo json_encode($result[0]);


?>

Я думаю, что это понять моего профи Блен, как решить.

Любая помощь будет высоко ценится, ребята.

...