我正在使用 Retrofit 来集成我的 Web 服务,但我不明白如何使用 POST 请求将 JSON 对象发送到服务器。我目前陷入困境,这是我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Retrofit retrofit = new Retrofit.Builder().baseUrl(url).
addConverterFactory(GsonConverterFactory.create()).build();
PostInterface service = retrofit.create(PostInterface.class);
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("email", "[email protected]");
jsonObject.put("password", "1234");
} catch (JSONException e) {
e.printStackTrace();
}
final String result = jsonObject.toString();
}
public interface PostInterface {
@POST("User/DoctorLogin")
Call<String> getStringScalar(@Body String body);
}
{
"email":"[email protected]",
"password":"1234"
}
{
"error": false,
"message": "User Login Successfully",
"doctorid": 42,
"active": true
}
在 gradle 中使用这些
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
使用这两个POJO类........
登录数据.class
public class LoginData {
private String email;
private String password;
public LoginData(String email, String password) {
this.email = email;
this.password = password;
}
/**
*
* @return
* The email
*/
public String getEmail() {
return email;
}
/**
*
* @param email
* The email
*/
public void setEmail(String email) {
this.email = email;
}
/**
*
* @return
* The password
*/
public String getPassword() {
return password;
}
/**
*
* @param password
* The password
*/
public void setPassword(String password) {
this.password = password;
}
}
登录结果.class
public class LoginResult {
private Boolean error;
private String message;
private Integer doctorid;
private Boolean active;
/**
*
* @return
* The error
*/
public Boolean getError() {
return error;
}
/**
*
* @param error
* The error
*/
public void setError(Boolean error) {
this.error = error;
}
/**
*
* @return
* The message
*/
public String getMessage() {
return message;
}
/**
*
* @param message
* The message
*/
public void setMessage(String message) {
this.message = message;
}
/**
*
* @return
* The doctorid
*/
public Integer getDoctorid() {
return doctorid;
}
/**
*
* @param doctorid
* The doctorid
*/
public void setDoctorid(Integer doctorid) {
this.doctorid = doctorid;
}
/**
*
* @return
* The active
*/
public Boolean getActive() {
return active;
}
/**
*
* @param active
* The active
*/
public void setActive(Boolean active) {
this.active = active;
}
}
像这样使用API
public interface RetrofitInterface {
@POST("User/DoctorLogin")
Call<LoginResult> getStringScalar(@Body LoginData body);
}
使用这样的调用....
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("Your domain URL here")
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
RetrofitInterface service = retrofit.create(RetrofitInterface .class);
Call<LoginResult> call=service.getStringScalar(new LoginData(email,password));
call.enqueue(new Callback<LoginResult>() {
@Override
public void onResponse(Call<LoginResult> call, Response<LoginResult> response) {
//response.body() have your LoginResult fields and methods (example you have to access error then try like this response.body().getError() )
}
@Override
public void onFailure(Call<LoginResult> call, Throwable t) {
//for getting error in network put here Toast, so get the error on network
}
});
编辑:-
将其放入
....success()
if(response.body().getError()){
Toast.makeText(getBaseContext(),response.body().getMessage(),Toast.LENGTH_SHORT).show();
}else {
//response.body() have your LoginResult fields and methods (example you have to access error then try like this response.body().getError() )
String msg = response.body().getMessage();
int docId = response.body().getDoctorid();
boolean error = response.body().getError();
boolean activie = response.body().getActive()();
}
注意:- 始终使用 POJO 类,它删除了改造中的 JSON 数据解析。
这个方法对我有用
将其添加到你的 gradle 中
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
界面
public interface ApiInterface {
String ENDPOINT = "http://10.157.102.22/rest/";
@Headers("Content-Type: application/json")
@POST("login")
Call<User> getUser(@Body String body);
}
活动
public class SampleActivity extends AppCompatActivity implements Callback<User> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiInterface.ENDPOINT)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface apiInterface = retrofit.create(ApiInterface.class);
// prepare call in Retrofit 2.0
try {
JSONObject paramObject = new JSONObject();
paramObject.put("email", "[email protected]");
paramObject.put("pass", "4384984938943");
Call<User> userCall = apiInterface.getUser(paramObject.toString());
userCall.enqueue(this);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onResponse(Call<User> call, Response<User> response) {
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
}
我认为你现在应该创建一个服务生成器类,然后 您应该使用 Call 来致电您的服务
PostInterface postInterface = ServiceGenerator.createService(PostInterface.class);
Call<responseBody> responseCall =
postInterface.getStringScalar(requestBody);
然后您可以使用它进行同步请求并获取响应正文:
responseCall.execute().body();
对于异步:
responseCall.enqueue(Callback);
请参阅下面提供的链接,了解完整的演练以及如何创建 ServiceGenerator :
https://futurestud.io/tutorials/retrofit-getting-started-and-android-client
从 Retrofit 2+ 开始,使用 POJO 对象而不是 JSON 对象来发送带有 @Body 注释的请求。发送 JSON 对象后,请求字段将设置为其默认值,而不是从后端应用程序发送的值。 POJO 对象不会出现这种情况。
Post 请求中的 Json
val jsonObject = JSONObject()
try {
jsonObject.put("name", name)
jsonObject.put("username", username)
jsonObject.put("email", email)
jsonObject.put("phone", phone)
jsonObject.put(
"token",
Prefs.getPrefInstance()!!.getValue(requireContext(), Const.TOKEN, "")
)
// jsonObject.put("image", uploaded_image);
jsonObject.put("image", url)
} catch (e: JSONException) {
binding.loader.visibility = View.GONE
e.printStackTrace()
}
val params = jsonObject.toString()
val user_registering = params.toRequestBody("application/json".toMediaTypeOrNull())