【问题标题】:PUT not working properly from my android project but working from PostmanPUT 在我的 android 项目中无法正常工作,但在 Postman 中工作
【发布时间】:2018-08-21 18:01:09
【问题描述】:

我正在尝试向服务器发送哈希图。我可以从 Postman 中输入 hashmap 的内容,但我无法从我的 android 项目中做同样的事情。回调首先执行Onfailure。在第二次尝试发送相同数据时,我收到 409 冲突响应。

失败的堆栈跟踪:

08-21 14:42:19.748 9876-9876/com.example.vishwa.postingdata W/System.err: java.io.EOFException: End of input at line 1 column 1 path $
08-21 14:42:19.750 9876-9876/com.example.vishwa.postingdata W/System.err:     at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1401)
    at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:549)
    at com.google.gson.stream.JsonReader.peek(JsonReader.java:425)
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:161)
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
08-21 14:42:19.751 9876-9876/com.example.vishwa.postingdata W/System.err:     at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
    at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
    at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:119)
    at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:218)
08-21 14:42:19.752 9876-9876/com.example.vishwa.postingdata W/System.err:     at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:112)
    at okhttp3.RealCall$AsyncCall.execute(RealCall.java:141)
    at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    at java.lang.Thread.run(Thread.java:818)

界面:

public interface APIService {

@POST("/posts")
@FormUrlEncoded
rx.Observable<Post> savePost(@Field("id") long id,
                             @Field("title") String title,
                             @Field("author") String author);

@PUT("/posts/{id}")
@FormUrlEncoded
Call<Post> updatePost(@Path("id") long id,
                      @Field("title") String title,
                      @Field("author") String author);
@DELETE("/posts/{id}")
Call<Post> deletePost(@Path("id") long id);

@PUT("authenticate/create")
Call<HashMap<String,String>> signUpParent(@Body HashMap<String,String> hashMap);
}

发帖功能:

private void PostData(HashMap<String, String> hashMap) {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://coreapi.xxxxx.org:8080/v1/")
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    APIService apiService =retrofit.create(APIService.class);

    apiService.signUpParent(hashMap).enqueue(new retrofit2.Callback<HashMap<String, String>>() {
        @Override
        public void onResponse(retrofit2.Call<HashMap<String, String>> call, Response<HashMap<String, String>> response) {
            Integer code=response.code();
            Toast.makeText(getBaseContext(),"checking the response : "+code,Toast.LENGTH_LONG).show();
            Log.i("success", "post submitted to API imaginators: ");
        }

        @Override
        public void onFailure(retrofit2.Call<HashMap<String, String>> call, Throwable t) {
            Log.e("failure", "Unable to submit post to API imaginators.");
            t.printStackTrace();
        }
    });
}

邮递员中给出的请求正文:

{
"clientid":"##########",
"email":"IAzMzkaksB8KGT2SLJsol7Xr9Phts/G8",
"first_name":"Eswar",
"last_name":"",
"password":"Dt9keQfZMUY=",
"security_answer":"",
"security_question":"",
"account_type":"learning_pod_app"
}

我从这些链接中找到了一些解决方案:onetwothree... 但它们不起作用。

感谢任何帮助。

【问题讨论】:

  • 我认为您正在发送JSON 数据,因此您还需要从 API 接受并返回 JSON
  • 使用 logcat 显示来自服务器的 JSON 响应。
  • @sontruongit 代码直接执行onfailure,所以我在第一次尝试时看不到响应。在它给出的第二个中,409 响应和 response.body() 给出了 null。
  • 把你所有的requestbody参数放在一个pojo类中,然后发送到服务器代替hashmap

标签: android gson retrofit2 postman put


【解决方案1】:

在 onFailure 方法中,使用 Log.e("failure", t.toString()); 捕获 Throweble;

然后您可以找到响应的确切问题。

【讨论】:

    【解决方案2】:

    将您的方法签名更改为:

    @Headers("Content-Type: application/json")
    @PUT("authenticate/create")
    Call<HashMap<String,String>> signUpParent(@Body HashMap<String, String> hashMap);
    

    如果响应为空,则可以使用。

    @Headers("Content-Type: application/json")
    @PUT("authenticate/create")
    Call<ResponseBody> signUpParent(@Body HashMap<String, String> hashMap);
    

    试一试。

    【讨论】:

    • 尝试此方法后出现此错误:“@FieldMap 参数只能与表单编码一起使用。(参数 #1)”。即使使用编码,我也会收到 400 响应。
    • 您能否在 Postman 中截取请求并突出显示正文选项卡?
    • 在 Postman 中,我收到 200 响应代码,但正文没有显示任何内容。
    • 我的意思是在你点击发送按钮之前请求正文没有响应。
    • 谢谢第二个工作,使用响应体。
    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 2015-08-09
    • 2020-08-21
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多