改造:Post 原始文本 "user={"key1": "value1", 等等}?
Retrofit: Post raw text "user={"key1": "value1", etc.}?
所以我对那个库 (Retrofit) 很陌生,实际上我被困在一个非典型案例上。
我有一个 API,我尝试在其中注册(注册)一个新用户,为了测试它,我在 Chrome 上使用 "DHC Rest Client"。当我发送这个时它有效(见下文):
Header:
Content-Type: application/x-www-form-urlencoded
Body(文字)
用户={"key1": "value1", "key2": "value2", 等等}
所以我的计划是在 Android 上做同样的事情!我创建了一个界面(见下文):
界面
interface RestRegister{
@Headers("Content-Type: application/x-www-form-urlencoded")
@POST("/api/register")
void postRegister(@Body String user, Callback<LoginResponse> callback);
}
但我总是从回调错误处理程序中得到 "Failed!"。我正确地获得了正确的参数(我将其作为具有正确格式的简单字符串 - "user={\"email\":\"lol@lol.us\",等等}")。
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://ENDPOINT:3000/")
.build();
RestRegister restRegister = restAdapter.create(RestRegister.class);
restRegister.postRegister("user={\"email\":\"lol@lol.us\",\"first_name\":\"jean\",\"last_name\":\"loop\",\"password\":\"test95test\",\"gender\":\"1\",\"birthdate\":\"1978/05/16\"}", new Callback<LoginResponse>() {
@Override
public void success(LoginResponse loginResponse, Response response) {
Toast.makeText(SignUp.this, query, Toast.LENGTH_LONG).show();
Toast.makeText(SignUp.this, "Created !", Toast.LENGTH_LONG).show();
Intent intent = new Intent("com.signupconfirmation");
startActivity(intent);
}
@Override
public void failure(RetrofitError error) {
Toast.makeText(SignUp.this, query, Toast.LENGTH_LONG).show();
Toast.makeText(SignUp.this, "Failed !", Toast.LENGTH_LONG).show();
}
});
}
});
稍后我也想以正确的格式创建一个 JSONObject ;)。
等待您的回答:) !
文档是这样建议的:
@FormUrlEncoded
@POST("/user/edit")
User updateUser(@Field("first_name") String first, @Field("last_name") String last);
你的情况是:
interface RestRegister{
@FormUrlEncoded
@POST("/api/register")
void postRegister(@Field("user") String data, Callback<LoginResponse> callback);
}
然后:
restRegister.postRegister("{\"email\":\"lol@lol.us\",\"first_name\":\"jean\",\"last_name\":\"loop\",\"password\":\"test95test\",\"gender\":\"1\",\"birthdate\":\"1978/05/16\"}", ...);
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://ENDPOINT:3000/")
.build();
应该是
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://ENDPOINT:3000")
.build();
例如:
@FormUrlEncoded
@POST("/alert.php")
void gettingfirsttimealert(@Field("key") String value, @Field("user_id") String user_id, Callback<JsonResponseis> cb);
JSON 回应
{ "success": true,
"details": {
"firstname": mathan,
"arraylist": [
"subscribe": "subscribe"
]
}
}
POJO class 应该是
public class JsonResponseis{
// Json response key is String
public String success;
//Json response key is JSON OBJECT
public Details details;
public class Details {
public String firstname;
//json response key is arraylist
public List<ArrayListis> arraylist;
}
public class ArrayListis{
public String subscribe;
}
}
回调应该是
public Callback downloadalertcalback = new Callback() {
String alertmediapath = "null";
String ts;
@Override
public void success(Object o, Response response) {
JsonResposeis u = (JsonResposeis ) o;
if (u.success != null) {
if (u.success.equalsIgnoreCase("true")) {
//Do here
}
}
}
@Override
public void failure(RetrofitError error) {
}
};
所以我对那个库 (Retrofit) 很陌生,实际上我被困在一个非典型案例上。
我有一个 API,我尝试在其中注册(注册)一个新用户,为了测试它,我在 Chrome 上使用 "DHC Rest Client"。当我发送这个时它有效(见下文):
Header:
Content-Type: application/x-www-form-urlencoded
Body(文字)
用户={"key1": "value1", "key2": "value2", 等等}
所以我的计划是在 Android 上做同样的事情!我创建了一个界面(见下文):
界面
interface RestRegister{
@Headers("Content-Type: application/x-www-form-urlencoded")
@POST("/api/register")
void postRegister(@Body String user, Callback<LoginResponse> callback);
}
但我总是从回调错误处理程序中得到 "Failed!"。我正确地获得了正确的参数(我将其作为具有正确格式的简单字符串 - "user={\"email\":\"lol@lol.us\",等等}")。
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://ENDPOINT:3000/")
.build();
RestRegister restRegister = restAdapter.create(RestRegister.class);
restRegister.postRegister("user={\"email\":\"lol@lol.us\",\"first_name\":\"jean\",\"last_name\":\"loop\",\"password\":\"test95test\",\"gender\":\"1\",\"birthdate\":\"1978/05/16\"}", new Callback<LoginResponse>() {
@Override
public void success(LoginResponse loginResponse, Response response) {
Toast.makeText(SignUp.this, query, Toast.LENGTH_LONG).show();
Toast.makeText(SignUp.this, "Created !", Toast.LENGTH_LONG).show();
Intent intent = new Intent("com.signupconfirmation");
startActivity(intent);
}
@Override
public void failure(RetrofitError error) {
Toast.makeText(SignUp.this, query, Toast.LENGTH_LONG).show();
Toast.makeText(SignUp.this, "Failed !", Toast.LENGTH_LONG).show();
}
});
}
});
稍后我也想以正确的格式创建一个 JSONObject ;)。
等待您的回答:) !
文档是这样建议的:
@FormUrlEncoded
@POST("/user/edit")
User updateUser(@Field("first_name") String first, @Field("last_name") String last);
你的情况是:
interface RestRegister{
@FormUrlEncoded
@POST("/api/register")
void postRegister(@Field("user") String data, Callback<LoginResponse> callback);
}
然后:
restRegister.postRegister("{\"email\":\"lol@lol.us\",\"first_name\":\"jean\",\"last_name\":\"loop\",\"password\":\"test95test\",\"gender\":\"1\",\"birthdate\":\"1978/05/16\"}", ...);
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://ENDPOINT:3000/")
.build();
应该是
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://ENDPOINT:3000")
.build();
例如:
@FormUrlEncoded
@POST("/alert.php")
void gettingfirsttimealert(@Field("key") String value, @Field("user_id") String user_id, Callback<JsonResponseis> cb);
JSON 回应
{ "success": true,
"details": {
"firstname": mathan,
"arraylist": [
"subscribe": "subscribe"
]
}
}
POJO class 应该是
public class JsonResponseis{
// Json response key is String
public String success;
//Json response key is JSON OBJECT
public Details details;
public class Details {
public String firstname;
//json response key is arraylist
public List<ArrayListis> arraylist;
}
public class ArrayListis{
public String subscribe;
}
}
回调应该是
public Callback downloadalertcalback = new Callback() {
String alertmediapath = "null";
String ts;
@Override
public void success(Object o, Response response) {
JsonResposeis u = (JsonResposeis ) o;
if (u.success != null) {
if (u.success.equalsIgnoreCase("true")) {
//Do here
}
}
}
@Override
public void failure(RetrofitError error) {
}
};