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
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
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(); } }); } }
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 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; } }
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 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; } }
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
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; } }
J'utilise EasyPHP pour la partie serveur, et je précise que ça fonctionnais pour les requêtes GET...
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); }
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 )
Le code PHP derrière test.php:
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 }
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 ):
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é )
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'
Si quelqu'un à une idée, je suis preneur parce que là, ça n'a pas de sens...
Merci,
EyesGammer
Partager