Android Retrofit - POST 请求不起作用,但在 Postman 中它有效

标签 android retrofit retrofit2 slim postman

这是我遇到的错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

我从 Postman 得到的 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 接口(interface):

public interface APIService {
@POST("/posts")
@FormUrlEncoded
Call<Post> savePost(@Field("title") String title,
                    @Field("body") String body,
                    @Field("userId") long userId);
}

我如何获得改造实例:

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 应用程序中使用它

知道如何解决吗? 可能是什么问题?

最佳答案

从您的基本网址 http://myurl/v1/ 中删除最后一个 /

这就是它抛出 404 的原因。

关于Android Retrofit - POST 请求不起作用,但在 Postman 中它有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42550437/

相关文章:

android - Android 上的 Parse.com API PHP 后端和本地存储

php - @Part List< MultipartBody.Part> 在 php 中

android - Google Map API 无法插入到包含 Google Map Json 的 URL 中

java - 使用 Retrofit2 和 rxJava2 解析来自 OpenWeatherMap 的数据

java - 如果用户不允许在 Android 中获取 map 精确位置的权限,则添加默认位置

java - 如何使用android中的代码从两个单声道音频文件创建立体声音频文件

Android IAB 错误 RPC :S-7 AEC-0

android - 如何通过改造 2 发布请求并获得响应?

java - 多端点 dagger2 改造

android - 改造创建 mock 无效的成功响应?