我正在尝试通过Retrofit在Android上执行POST请求。 我必须以以下格式发送数据 {number:“ background_number”} 在请求的正文中。 并以以下格式获取答案 {状态:“确定”,“读取:” 123123”} 下面是我的代码。
package com.example.test;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import okhttp3.Request;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class MainActivity extends AppCompatActivity {
private APIServicePost mService;
MyTask mt;
String status;
String body;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mService = ApiUtils.getAPIService();
}
public void sendPost( String body) {
mService.savePost(body).enqueue(new Callback<Post>() {
@Override
public void onResponse(Call<Post> call, Response<Post> response) {
if (response.isSuccessful()) {
response.body().toString();
Log.i("PostActivity", "post submitted to API." + response.body().toString());
}
}
@Override
public void onFailure(Call<Post> call, Throwable t) {
Log.e("PostActivity", "Unable to submit post to API.");
}
});
}
public void onclick(View v) {
mt = new MyTask();
mt.execute();
}
class MyTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
Log.e("PostActivity", "BG WORKING");
sendPost("+79228034507");
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
}
package com.example.test;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface APIServicePost {
@POST("/start_go_sms/")
@FormUrlEncoded
Call<Post> savePost(@Field("number") String title);
}
package com.example.test;
import android.app.Application;
public class ApiUtils {
public static final String BASE_URL = "My base url";
public static APIServicePost getAPIService() {
return RetrofitClient.getClient(BASE_URL).create(APIServicePost.class);
}
}
package com.example.test;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Post {
@SerializedName("status")
@Expose
private String status;
@SerializedName("rid")
@Expose
private String rid;
public String getStatus(){
return status;
}
public String getRid(){
return rid;
}
}
package com.example.test;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitClient {
private static Retrofit retrofit = null;
public static Retrofit getClient(String baseUrl) {
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
代码正在执行,但是没有响应或错误。 允许上网
答案 0 :(得分:0)
尝试此服务生成器
public class ServiceGenerator {
private static Object instance;
@SuppressWarnings("unchecked")
public static <S> S createService(Class<S> serviceClass, String baseUrl) {
if (instance == null) {
instance = service(serviceClass, baseUrl);
return (S) instance;
} else {
return (S) instance;
}
}
private static <S> S service(Class<S> serviceClass, String baseUrl) {
//HttpLoggingInterceptor logger = new HttpLoggingInterceptor();
//if (debug)
// logger.setLevel(HttpLoggingInterceptor.Level.BODY);
//else
// logger.setLevel(HttpLoggingInterceptor.Level.NONE);
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.retryOnConnectionFailure(true)
.readTimeout(120, TimeUnit.SECONDS)
.connectTimeout(120, TimeUnit.SECONDS);
// if (debug)
// httpClient.networkInterceptors().add(logger);
OkHttpClient client = httpClient.build();
Gson gson = new GsonBuilder()
.setLenient()
.create();
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(baseUrl)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson));
Retrofit retrofit = builder
.client(client)
.build();
return retrofit.create(serviceClass);
}
}
并以这种方式使用
retroClient = ServiceGenerator.createService(RetroClient.class, AppConstants.BASE_URL)
retroClient.savePost(title)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Call<response>() {
@Override
public void onSubscribe(Disposable d) {
getDisposable().add(d);
}
@Override
public void onSuccess(Call<response> result) {
Logger.d(TAG, "get Result: " + result.isSuccess());
}
@Override
public void onError(Throwable e) {
Logger.d(TAG, "onError" + e.getMessage());
}
});
}
和您的帖子
@Headers("Accept: application/json")
@POST("/start_go_sms/")
@FormUrlEncoded
Call<Post> savePost(@Field("number") String title)