PUT 在我的 android 项目中无法正常工作,但在 Postman 中工作
PUT not working properly from my android project but working from Postman
我正在尝试向服务器发送哈希图。我可以从 Postman 中 PUT 哈希图的内容,但我无法从我的 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.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);
}
函数到post:
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();
}
});
}
postman 中给出的请求正文:
{
"clientid":"##########",
"email":"IAzMzkaksB8KGT2SLJsol7Xr9Phts/G8",
"first_name":"Eswar",
"last_name":"",
"password":"Dt9keQfZMUY=",
"security_answer":"",
"security_question":"",
"account_type":"learning_pod_app"
}
我从这些链接中找到了一些解决方案:, two, three...
但它们不起作用。
感谢任何帮助。
将您的方法签名更改为:
@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);
并尝试一下。
在 onFailure 方法中,使用 Log.e("failure", t.toString());
捕获 Throweble
然后您可以通过响应找到确切的问题。
我正在尝试向服务器发送哈希图。我可以从 Postman 中 PUT 哈希图的内容,但我无法从我的 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.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);
}
函数到post:
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();
}
});
}
postman 中给出的请求正文:
{
"clientid":"##########",
"email":"IAzMzkaksB8KGT2SLJsol7Xr9Phts/G8",
"first_name":"Eswar",
"last_name":"",
"password":"Dt9keQfZMUY=",
"security_answer":"",
"security_question":"",
"account_type":"learning_pod_app"
}
我从这些链接中找到了一些解决方案:
感谢任何帮助。
将您的方法签名更改为:
@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);
并尝试一下。
在 onFailure 方法中,使用 Log.e("failure", t.toString());
捕获 Throweble然后您可以通过响应找到确切的问题。