[英]Retrofit2 send POST request
I am trying to perform a POST request on Android via Retrofit.我正在尝试通过 Retrofit 在 Android 上执行 POST 请求。 I have to send the data in the format {number: "background_number"} in the body of the request.
我必须在请求正文中以 {number: "background_number"} 格式发送数据。 And get the answer in the format {status: "ok", "read:" 123123 "} Below is my code.
并以 {status: "ok", "read:" 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;
}
}
The code is executing, but there is no response or error.代码正在执行,但没有响应或错误。 Internet access allowed
允许上网
try this service generator试试这个服务生成器
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);
}
}
and use it in this way并以这种方式使用它
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());
}
});
}
and your post和你的帖子
@Headers("Accept: application/json")
@POST("/start_go_sms/")
@FormUrlEncoded
Call<Post> savePost(@Field("number") String title)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.