使用url + json return方法改造POST方法不允许

时间:2018-09-25 10:14:49

标签: android retrofit retrofit2

我的POST API如下:https://out-test.com/test/out/{ "key":"value" }

当我在浏览器中复制粘贴URL时,它可以正常工作,它接受它。 但是在Android中,我得到了回复Method Not Allowed

我的API调用:

@POST
Call<OUT> updateOUT( @Url String urlWithJson );

改装声明:

     //  Retrofit2 implementation
    String BASE_API_URL = "https://out-test.com/";
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl( BASE_API_URL )
            .addConverterFactory( GsonConverterFactory.create() )
            .build();

    final OutAPI api = retrofit.create( OutAPI.class );

将对象解析为String(我已经对JSON进行了验证)

 Gson gson = new Gson();
            String jsonString = gson.toJson(out);
            String url = "test/out/" + jsonString;

然后我打电话给POST:

 api.updateOut( url ).enqueue(new Callback<Out>() {
    @Override
    public void onResponse(Call<Out> call, Response<Out> response) {
       Log.d(TAG, "onResponse:" + response );
    }

    @Override
    public void onFailure(Call<Out> call, Throwable t) {
        Log.d(TAG, "onFailure: " + t);
    }
 });

有人知道我在这里做错了什么吗?我想念某个地方吗?在互联网上进行搜索,但找不到任何可行的解决方案。

@EDIT: 当我调试并查看响应和URL时(如果我将URL的值复制并粘贴到浏览器中),它将正常工作。

问候

3 个答案:

答案 0 :(得分:0)

尝试更换

@POST
Call<OUT> updateOUT( @Url String urlWithJson );

此以及以下内容。

@POST("test/out/{key_value}")
Call<OUT> updateOUT(@Path("key_value") String keyAndValue);

然后,按如下所示更新其余代码

//  Retrofit2 implementation

String BASE_API_URL = "https://out-test.com/";
Retrofit retrofit = new Retrofit.Builder()
            .baseUrl( BASE_API_URL )
            .addConverterFactory( GsonConverterFactory.create() )
            .build();

final OutAPI api = retrofit.create( OutAPI.class );

Gson gson = new Gson();
String jsonString = gson.toJson(out);

api.updateOut(jsonString).enqueue(new Callback<Out>() {
    @Override
    public void onResponse(Call<Out> call, Response<Out> response) {
       Log.d(TAG, "onResponse:" + response );
    }

    @Override
    public void onFailure(Call<Out> call, Throwable t) {
        Log.d(TAG, "onFailure: " + t);
    }
 });

答案 1 :(得分:0)

使用改装提供的车身,并这样做

@POST("test/out/")
    Call<OUT> updateOUT(@Body JsonObject urlWithJson );

    then follow
    Retrofit declaration:

         //  Retrofit2 implementation
        String BASE_API_URL = "https://out-test.com/";
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl( BASE_API_URL )
                .addConverterFactory( GsonConverterFactory.create() )
                .build();

    Then Pass your Json using GSON like:

    JsonObject jsonObj= new JsonObject
    jsonObj.addProperty("order",yourvalue) ;
    And then call POST :

     api.updateOut( jsonObj).enqueue(new Callback<Out>() {
        @Override
        public void onResponse(Call<Out> call, Response<Out> response) {
           Log.d(TAG, "onResponse:" + response );
        }

        @Override
        public void onFailure(Call<Out> call, Throwable t) {
            Log.d(TAG, "onFailure: " + t);
        }
     });

答案 2 :(得分:0)

感觉有点愚蠢,但是问题是创建API的人为我提供了错误的文档。请求不是POST,而是GET。但是仍然存在错误问题,但是这次是错误的Content-Type,而不是text/plain,是application/json。谢谢大家,为我提供帮助。正如@Yupi所建议的,Postman是调试此问题的工具。谢谢。