IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Studio Java Discussion :

Problème avec requête POST Retrofit2


Sujet :

Android Studio Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 51
    Points : 27
    Points
    27
    Par défaut Problème avec requête POST Retrofit2
    Bonjour,

    Je vient sur ce forum car je cherche désespérément depuis hier une solution à mon problème...:
    Je cherche à faire une requête POST sur mon serveur local dans l'idée de faire une API en PHP.
    Le problème est que j'ai cette erreur à chaque fois: "JsonReader.setlenient(true) to accept malformed JSON at line 1 column 1 path $"

    Mais ce qui est vraiment dérangeant c'est que mon JSON n'est pas malformé, je ne comprend donc pas pourquoi j'ai cette erreur...

    Voici les codes:

    DatabaseActivity.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    package com.example.test;
     
    import android.os.Bundle;
    import android.widget.TextView;
    import android.widget.Toast;
     
    import androidx.appcompat.app.AppCompatActivity;
     
    import retrofit2.Call;
    import retrofit2.Callback;
    import retrofit2.Response;
     
    public class DatabaseActivity extends AppCompatActivity {
        private TextView textViewResult;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_database);
            textViewResult = findViewById(R.id.textView);
            saveUser(createRequest());
        }
     
        public UserRequest createRequest() {
            UserRequest userRequest = new UserRequest();
            userRequest.setUserId(10);
            userRequest.setTitle("Test");
            userRequest.setBody("Autre");
            return userRequest;
        }
     
        public void saveUser(UserRequest userRequest) {
            Call<UserResponse> userResponseCall = ApiClient.getUserService().saveUser(userRequest);
            userResponseCall.enqueue(new Callback<UserResponse>() {
                @Override
                public void onResponse(Call<UserResponse> call, Response<UserResponse> response) {
                    if(response.isSuccessful()) {
                        Toast.makeText(DatabaseActivity.this, "Test successful", Toast.LENGTH_LONG).show();
                    }else{
                        Toast.makeText(DatabaseActivity.this, "Test failed", Toast.LENGTH_LONG).show();
                    }
                }
     
                @Override
                public void onFailure(Call<UserResponse> call, Throwable t) {
                    Toast.makeText(DatabaseActivity.this, "Test failed " + t.getLocalizedMessage(), Toast.LENGTH_LONG).show();
                }
            });
        }
    }
    ApiClient.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package com.example.test;
     
    import retrofit2.Retrofit;
    import retrofit2.converter.gson.GsonConverterFactory;
     
    public class ApiClient {
        private static Retrofit getRetrofit() {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://10.0.2.2/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            return retrofit;
        }
     
        public static UserService getUserService() {
            UserService userService = getRetrofit().create(UserService.class);
            return userService;
        }
    }
    UserRequest.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package com.example.test;
     
    public class UserRequest {
        private int userId;
        private String title;
        private String body;
        public int getUserId() {
            return userId;
        }
        public void setUserId(int userId) {
            this.userId = userId;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public String getBody() {
            return body;
        }
        public void setBody(String body) {
            this.body = body;
        }
    }
    UserResponse.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    package com.example.test;
     
    public class UserResponse {
        private int userId;
        private int id;
        private String title;
        private String body;
        public int getUserId() {
            return userId;
        }
        public void setUserId(int userId) {
            this.userId = userId;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public String getBody() {
            return body;
        }
        public void setBody(String body) {
            this.body = body;
        }
    }
    UserService.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package com.example.test;
     
    import retrofit2.Call;
    import retrofit2.http.Body;
    import retrofit2.http.POST;
     
    public interface UserService {
        @POST("test.php")
        Call<UserResponse> saveUser(@Body UserRequest userRequest);
    }
    J'utilise EasyPHP pour la partie serveur, et je précise que ça fonctionnais pour les requêtes GET...
    La page test.php renvoie ça: ( C'est un résultat statique pour faire des tests, mais je tient à préciser que ça ne fonctionne pas non plus quand je suis connecté à la BDD )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {
        "id": 10,
        "title": "This is a test",
        "body": "test",
        "userId": 3
    }
    Le code PHP derrière test.php:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    	$a = array();
    	$a["id"] = 10;
    	$a["title"] = "This is a test";
    	$a["body"] = "test";
    	$a["userId"] = 3;
    	header('Content-Type: application/json');
    	echo json_encode($a, JSON_PRETTY_PRINT);
    ?>

    On ne peut pas faire plus simple au niveau du JSON, et il est normalement bien formé si on regarde bien les codes de "UserRequest.java" et "UserResponse.java", donc je ne comprend pas pourquoi j'ai cette erreur...

    Au niveau des implémentations Retrofit2 et Gson, c'est ça ( dans le build.gradle ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    P.S: Je ne vous met pas les layout car le MainActivity à simplement un bouton qui envoie sur DatabaseActivity, et sur DatabaseActivity il y a simplement un TextView ( qui n'est pas utilisé )

    Si quelqu'un à une idée, je suis preneur parce que là, ça n'a pas de sens...

    Merci,

    EyesGammer

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 51
    Points : 27
    Points
    27
    Par défaut
    Bon, j'ai finalement trouver une solution !

    J'ai changer le fichier "UserService.java":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    package com.example.test;
     
    import retrofit2.Call;
    import retrofit2.http.Field;
    import retrofit2.http.FormUrlEncoded;
    import retrofit2.http.POST;
     
    public interface UserService {
        @FormUrlEncoded
        @POST("test.php")
        Call<UserResponse> createUser(
                @Field("userId") int userId,
                @Field("title") String title,
                @Field("body") String body
        );
    }
    Et donc le fichier "DatabaseActivity.java" devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    package com.example.test;
     
    import android.os.Bundle;
    import android.widget.TextView;
    import android.widget.Toast;
     
    import androidx.appcompat.app.AppCompatActivity;
     
    import retrofit2.Call;
    import retrofit2.Callback;
    import retrofit2.Response;
     
    public class DatabaseActivity extends AppCompatActivity {
        private TextView textViewResult;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_database);
            textViewResult = findViewById(R.id.textView);
            test();
        }
     
        public void test() {
            Call<UserResponse> responseBodyCall = ApiClient.getUserService().createUser(10, "Test", "Autre");
            responseBodyCall.enqueue(new Callback<UserResponse>() {
                @Override
                public void onResponse(Call<UserResponse> call, Response<UserResponse> response) {
                    UserResponse testResponse = response.body();
                    String content = "";
                    content += "Id: " + testResponse.getId() + "\n";
                    content += "UserId: " + testResponse.getUserId() + "\n";
                    content += "Title: " + testResponse.getTitle() + "\n";
                    content += "Body: " + testResponse.getBody() + "\n";
                    Toast.makeText(DatabaseActivity.this, content, Toast.LENGTH_LONG).show();
                }
     
                @Override
                public void onFailure(Call<UserResponse> call, Throwable t) {
                    Toast.makeText(DatabaseActivity.this, "Test failed: " + t.getLocalizedMessage(), Toast.LENGTH_LONG).show();
                }
            });
        }
    }
    Donc finalement, je pense que le JSON était bien malformé, mais pas par l'API, mais par l'Application en elle-même...

    Merci,

    EyesGammer

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [HSQLDB]Problèmes avec requête
    Par Baptiste Wicht dans le forum JDBC
    Réponses: 7
    Dernier message: 06/06/2006, 22h28
  2. Problèmes avec Requêtes d'extraction
    Par NoBru dans le forum Access
    Réponses: 3
    Dernier message: 03/06/2006, 15h25
  3. Problème avec requête ajout
    Par teffal dans le forum Access
    Réponses: 3
    Dernier message: 29/04/2006, 16h41
  4. Problème avec requête ajout
    Par mitnick32 dans le forum Access
    Réponses: 1
    Dernier message: 02/02/2006, 18h02
  5. [VB6] Problème avec requête Update
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 02/02/2006, 03h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo