这是我得到的错误:
com.google.gson.JsonSyntaxException:java.lang.IllegalStateException: 预期BEGIN_OBJECT但在第1行第1行路径$ STR的STRING
我从邮递员那里得到的JSON回复:
{
"title": "test title",
"body": "test body",
"userId": 1,
"id": 101
}
这就是我回应其余API(使用slim2框架)的响应的方式:
$app->post('/posts', function() use($app){
$res = array(
"title" => $app->request->post('title'),
"body" => $app->request->post('body'),
"userId" => 1,
"id" => 101
);
echoResponse(201, $res);
});
echoResponse
方法:
function echoResponse($status_code, $response) {
$app = \Slim\Slim::getInstance();
$app->status($status_code);
$app->contentType('application/json');
echo json_encode($response);
}
我调用API的方法:
public void sendPost(String title, String body) {
mAPIService.savePost(title, body, 1).enqueue(new Callback<Post>() {
@Override
public void onResponse(Call<Post> call, Response<Post> response) {
Log.i(TAG, "post sendPost to onResponse.");
if(response.isSuccessful()) {
showResponse(response.body().toString());
Log.i(TAG, "post submitted to API." + response.body().toString());
}
}
@Override
public void onFailure(Call<Post> call, Throwable t) {
Log.e(TAG, "Unable to submit post to API.");
Log.e(TAG, t.toString());
}
});
}
APIServie
界面:
public interface APIService {
@POST("/posts")
@FormUrlEncoded
Call<Post> savePost(@Field("title") String title,
@Field("body") String body,
@Field("userId") long userId);
}
我如何获得retrofit
实例:
mAPIService = ApiUtils.getAPIService();
public class ApiUtils {
private ApiUtils() {}
public static final String BASE_URL = "http://myurl/v1/";
public static APIService getAPIService() {
return RetrofitClient.getClient(BASE_URL).create(APIService.class);
}
}
public class RetrofitClient {
private static Retrofit retrofit = null;
private static Gson gson = new GsonBuilder()
.setLenient()
.create();
public static Retrofit getClient(String baseUrl) {
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
return retrofit;
}
}
我发布所有这些的原因是我无法找到问题所在,因为我从API获得的JSON响应看起来没问题,我调用API的方式看起来还不错。有很多与此相关的问题可以在这里找到。但我找不到问题的答案。请找到我的解决方案。感谢
编辑: @Darpan和@Fred是对的。我启用了日志记录以进行改造。这就是它所说的
D/OkHttp: --> POST http://myurl/posts http/1.1
D/OkHttp: Content-Type: application/x-www-form-urlencoded
D/OkHttp: Content-Length: 26
D/OkHttp: title=vz&body=gde&userId=1
D/OkHttp: --> END POST (26-byte body)
D/OkHttp: <-- 200 OK http://mywebsite/404/
<html of my 404 page>
D/OkHttp: <-- END HTTP (2119-byte body)
它给了我服务器的404.html文件作为回复。但是当我从POSTMAN调用相同的API时,它给了我想要的结果。
所以基本上我可以访问并从POSTMAN获取结果,但不能使用改造从Android应用程序中使用它
知道怎么解决吗? 可能是什么问题?
答案 0 :(得分:3)
从基本网址/
http://myurl/v1/
这就是它抛出404的原因。
答案 1 :(得分:1)
创建bellow类并将Call<Post>
更改为Call<MyResponse>
public class MyResponse {
@SerializedName("result")
private String result;
@SerializedName("data")
private Data data;
public class Data {
@SerializedName("title")
@Expose
private String title;
@SerializedName("body")
@Expose
private String body;
@SerializedName("userId")
@Expose
private String userId;
@SerializedName("id")
@Expose
private String 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;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
}
您应该像这样更改您的json格式
{
"result" : "success",
"data" : {
"title":"title",
"body":"body",
"user_id":"userid",
"id":"id"
}
}
现在你可以像这样回复 MyResponse res = response.body();
并打印响应,如 Log.d(&#34;响应&#34;,新Gson()。toJson(res));
答案 2 :(得分:0)
我遇到了同样的错误,而根本原因是我的Api期待通过style.css
进行呼叫,而Android则是通过https://my.url.com
进行请求。我们查看了日志,服务器将请求视为GET而不是POST。
将网址更改为http://my.url.com
后,它可以正常工作。希望这对别人有帮助