我真的很感激我能得到的任何帮助!很抱歉这个问题很长。
我正在创建此Android应用,在哪里注册,用户将输入他们的电话号码并提交,以通过短信获取验证码。
我已经完成了本教程: https://code.tutsplus.com/tutorials/sending-data-with-retrofit-2-http-client-for-android--cms-27845
我已将其应用中的2个字段缩减为一个字段 - 一个电话号码的文本字段和下面的提交按钮。此电话号码将发送到API。
我对Retrofit很陌生,我现在已经尝试了一段时间成功发送API调用。我已经使用' Postman'测试了API调用。桌面应用程序,API还活着并且响应......我还没有能够形成发送到API的有效请求。
我们的API人员设计的JSON模式...对于此活动只需要一个字符串,即电话号码:
{
"phone_number": "string"
}
然后如果它是有效的电话号码且用户不在数据库中,则会收到200回复
{
"message": "string"
}
或者您可以从API中获得400响应
{
"error": "string",
"description": "string"
}
我的改造界面,名为APIService.java,如下所示:
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.Body;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface APIService {
@POST("/verifications/signup/send")
@FormUrlEncoded
Call<Post> sendPhoneNumber(@Field("phone_number") String phone_number);
}
我真的很擅长改造2,而且上面,我能感觉到一个问题,我不知道如何解决。从我给出的API模式中,我发送给API的这个参数应该是&#39; body&#39; .... not&#39; field&#39;。也许在改装@Body ......我不太确定如何在上面的java文件中实现它。
现在,我在下面做的可能真的很蠢......我不明白改造java&#39;模型&#39;应该上课。我遵循了一个在RESPONSE之后对类进行建模的教程,而不是数据调用。所以,我修改了他们的Post类(我称之为我的?JSON对象发送一个电话号码)。所以我的Post类看起来像这样:
public class Post {
@SerializedName("message")
@Expose
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
//return "Post{" + "message = " + message + '}';
return "This is a return message string";
}
}
老实说,我认为我所做的可能完全错了,但我不知道如何设计对象(Post)类,因为我甚至不知道这个类将用于什么...除了得到回复之外?
public class MainActivity extends Activity {
private TextView mResponseTv;
private APIService mAPIService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText phoneNumberEt = (EditText)
findViewById(R.id.et_phoneNumber);
Button submitBtn = (Button) findViewById(R.id.btn_submit);
mResponseTv = (TextView) findViewById(R.id.tv_response);
mAPIService = ApiUtils.getAPIService();
submitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String phoneNumber = phoneNumberEt.getText().toString().trim();
if (!TextUtils.isEmpty(phoneNumber)) {
sendPost(phoneNumber);
}
}
});
}
public void sendPost(String phone_number) {
mAPIService.sendPhoneNumber(phone_number).enqueue(new Callback<Post>() {
@Override
public void onResponse(Call<Post> call, Response<Post> response) {
int statusCode = response.code();
if (response.isSuccessful()) {
showResponse("Response code is " + statusCode + ". Submitted successfully to API - " + response.body().toString());
Log.i(TAG, "post submitted to API." + response.body().toString());
}
}
@Override
public void onFailure(Call<Post> call, Throwable t) {
showResponse("Unable to submit post to API.");
Log.e(TAG, "Unable to submit post to API.");
}
});
}
public void showResponse(String response) {
if (mResponseTv.getVisibility() == View.GONE) {
mResponseTv.setVisibility(View.VISIBLE);
}
mResponseTv.setText(response);
}
}
我的其他文件与上面教程链接中的文件非常相似。这是我修改的内容以获得我的简单文本字段版本。
当我能够联系API时,我可以阅读回复,然后我会将其合并到我正在处理的真实应用中。
目前,该应用程序已压缩,并在我的手机(以及模拟器)上运行。当我提交电话号码时,提交按钮下方的文本字段不会显示任何类似的消息......所以我确定一旦出现问题
mAPIService.sendPhoneNumber(phone_number).enqueue(new Callback<Post>() {
@Override
public void onResponse(Call<Post> call, Response<Post> response)
{
在MainActivity中达到。
答案 0 :(得分:0)
根据带有电话号码的JSON架构,您需要在API正文中传递电话号码。而不是使用@Field注释,使用@Body注释,其中参数将是RequestBody类的实例。
@Field文档https://square.github.io/retrofit/2.x/retrofit/retrofit2/http/Field.html
使用字段电话号码创建新的RequestBody类。
public class RequestBody {
@Expose
@SerializedName("phone_number")
private String phoneNumber;
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getPhoneNumber() {
return phoneNumber;
}
从您想要传递电话号码的活动中,创建RequestBody类的对象,在setPhoneNumber()方法中传递电话号码。然后在APIService中将此对象作为参数传递。
在MainActivity.class中,
public void sendPost(String phone_number) {
RequestBody requestBody = new RequestBody();
requestBody.setPhoneNumber(phone_number);
mAPIService.sendPhoneNumber(requestBody).enqueue(new Callback<Post>() {
@Override
public void onResponse(Call<Post> call, Response<Post> response)
{
您的APIService将如此
public interface APIService {
@POST("/verifications/signup/send")
@FormUrlEncoded
Call<Post> sendPhoneNumber(@Body RequestBody requestBody);
}
答案 1 :(得分:0)
我认为这个api需要JsonObject中的参数。所以试试这个
在您的APIService中
@POST("/verifications/signup/send")
Call<JsonObject> sendPhoneNumber(@Body JsonObject phone_number);
发送数据时使用此
JsonObject object=new JsonObject();
object.addProperty("phone_number",yourPhoneNumber);
并在您的发送帖子方法
mAPIService.sendPhoneNumber(object).enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
int statusCode = response.code();
if (response.isSuccessful()) {
showResponse("Response code is " + statusCode + ". Submitted successfully to API - " + response.body().toString());
Log.i(TAG, "post submitted to API." + response.body().toString());
}
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
showResponse("Unable to submit post to API.");
Log.e(TAG, "Unable to submit post to API.");
}
});
}
请尝试让我知道它是否正常工作。