POST 请求 Json 文件传递 String 并等待响应 Volley
POST Request Json file passing String and wait for the response Volley
我是 Android 和 Volley 的新手,我需要您的帮助。
我需要 post 一个字符串,有一个 json 来响应它,如果它没有提出错误的请求,则使用来自我的请求的一些值开始一个新的意图。
这是我想做的事情的简单模式:
按登录按钮 -> 星标请求 -> 检查是否正常 -> 使用响应值启动新意图。
我看到Volley是用异步方式查询的。
这是我的代码:
boolean temp=false;
login.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
boolean temp=false;
if (!id.getText().toString().isEmpty() && !pw.getText().toString().isEmpty()) {
temp = verifyCredentials(v.getContext()); //Doesn't work because Volley is asynchronous.
if(temp==true)
{
Intent intentMain = new Intent(v.getContext(), MainActivity.class);//MainActivity.class);
intentMain.putExtra("username", id.getText().toString());
startActivityForResult(intentMain, 0);
}
} else {//strighe vuote
//toast
Toast.makeText(v.getContext(), "Compila i campi", Toast.LENGTH_SHORT).show();
}
}
});
public boolean verifyCredentials(Context context) {
final boolean[] tempToReturn = {false};
mTextView = (TextView) findViewById(R.id.textView2);
RequestQueue queue = Volley.newRequestQueue(context);
StringRequest stringRequest = new StringRequest(Request.Method.POST, apiURL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
mTextView.setText("Response is:" + response.substring(500));
tempToReturn[0] =true;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
String json = null;
NetworkResponse response = error.networkResponse;
if(response != null && response.data != null){
switch(response.statusCode){
case 400:
json = new String(response.data);
json = trimMessage(json, "message");
if(json != null) displayMessage(json);
break;
}
//Additional cases
}
mTextView.setText("Error bad request");
}
public String trimMessage(String json, String key){
String trimmedString = null;
try{
JSONObject obj = new JSONObject(json);
trimmedString = obj.getString(key);
} catch(JSONException e){
e.printStackTrace();
return null;
}
return trimmedString;
}
//Somewhere that has access to a context
public void displayMessage(String toastString){
mTextView.setText("Response is:" +toastString);
}
}){
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
AuthenticationUserName = id.getText().toString();
AuthenticationPassword = pw.getText().toString();
params.put("grant_type", Authenticationgrant_type);
params.put("username", AuthenticationUserName);
params.put("password", AuthenticationPassword);
return params;
}
};
queue.add(stringRequest);
return tempToReturn[0];
}
我正在使用 Volley,因为我的 gradle 是 23,我的 APi 级别也是,所以我不能使用 apache 包。
编辑:新代码:
public void onClick(View v) {
boolean temp = true;
if (!id.getText().toString().isEmpty() && !pw.getText().toString().isEmpty()) {
myContext = v.getContext();
VolleyResponseListener listener = new VolleyResponseListener() {
@Override
public void onError(VolleyError error) {
String json = null;
NetworkResponse response = error.networkResponse;
if(response != null && response.data != null){
switch(response.statusCode){
case 400:
json = new String(response.data);
json = trimMessage(json, "message");
if(json != null) displayMessage(json);
break;
}
//Additional cases
}
mTextView.setText("Error bad request");
}
@Override
public void onResponse(JSONObject response) {
try {
fullName = response.getString("fullName");
token= response.getString("access_token");
expirationDate=response.getString(".expires");
} catch (JSONException e) {
e.printStackTrace();
}
mTextView.setText("Response is:" + fullName+token+expirationDate);
Intent intentMain = new Intent(myContext, MainActivity.class);//MainActivity.class);
intentMain.putExtra("username", id.getText().toString());
startActivityForResult(intentMain, 0);
}
public String trimMessage(String json, String key){
String trimmedString = null;
try{
JSONObject obj = new JSONObject(json);
trimmedString = obj.getString(key);
} catch(JSONException e){
e.printStackTrace();
return null;
}
return trimmedString;
}
//Somewhere that has access to a context
public void displayMessage(String toastString){
//Toast.makeText(MainActivity.this, toastString, Toast.LENGTH_LONG).show();
mTextView.setText("Response is:" +toastString);
}
};
verifyCredentials(myContext,listener);
我已经创建了这个界面:
public interface VolleyResponseListener {
void onError(VolleyError error);
void onResponse(JSONObject response);
}
这是我的验证凭证的新代码:
public boolean verifyCredentials(Context context,final VolleyResponseListener listener) {
final boolean[] tempToReturn = {false};
mTextView = (TextView) findViewById(R.id.textView2);
Map<String,String> params = new HashMap<String, String>();
AuthenticationUserName = id.getText().toString();
AuthenticationPassword = pw.getText().toString();
//key value
params.put("grant_type", Authenticationgrant_type);
params.put("username", AuthenticationUserName);
params.put("password", AuthenticationPassword);
RequestQueue queue = Volley.newRequestQueue(context);
SimpleRequest jsObjRequest = new SimpleRequest(Request.Method.POST, apiURL,
params,new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
listener.onResponse(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onError(error);
}
}
});
queue.add(jsObjRequest);
return tempToReturn[0];
}
我已经回答了一些看起来像您的问题的问题,例如:
您不应该等待那个布尔值 return。相反,您可以尝试以下方式(当然,您可以将 JSONArray
请求替换为 JSONObject
或 String
请求):
VolleyResponseListener listener = new VolleyResponseListener() {
@Override
public void onError(String message) {
// do something...
}
@Override
public void onResponse(Object response) {
// do something...
}
};
makeJsonArrayRequest(context, Request.Method.POST, url, requestBody, listener);
makeJsonArrayRequest
的正文可以如下:
public void makeJsonArrayRequest(Context context, int method, String url, String requestBody, final VolleyResponseListener listener) {
JSONObject jsonRequest = null;
try {
...
if (requestBody != null) {
jsonRequest = new JSONObject(requestBody);
}
...
} catch (JSONException e) {
e.printStackTrace();
}
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(method, url, jsonRequest, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray jsonArray) {
listener.onResponse(jsonArray);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onError(error.toString());
}
});
// Access the RequestQueue through singleton class.
MySingleton.getInstance(context).addToRequestQueue(jsonArrayRequest);
}
VolleyResponseListener
界面如下:
public interface VolleyResponseListener {
void onError(String message);
void onResponse(Object response);
}
请在下方留言:
first of all is: the "order" of the method, for example in my case,
After pressing button, which method I have to call?
假设我们在 onCreate
里面:
您可以先创建VolleyResponseListener listener
,然后在按下按钮时调用verifyCredentials(..., listener);
。
And where I can call the intent?
上面VolleyResponseListener listener
的onResponse
里面会调用这个(当然里面可以根据自己的需求查看更多的条件)
Second: I have to send a String but I want a jsonArrayRespond, there
is a method to do this? Or it work only with 2 kind of parameter such
string request/string sent and json request/json sent?
根据Google's training documentation:
- StringRequest:指定 URL 并接收 原始字符串作为响应。
- ImageRequest:指定 URL 并接收 图像作为响应。
- JsonObjectRequest 和 JsonArrayRequest(都是
JsonRequest): 指定一个URL并得到一个JSON对象或array
(分别)回应.
当然,对于没有开箱即用的 Volley 支持的类型,您可以实现自己的自定义请求类型。看看Implementing a Custom Request.
希望对您有所帮助!
我是 Android 和 Volley 的新手,我需要您的帮助。 我需要 post 一个字符串,有一个 json 来响应它,如果它没有提出错误的请求,则使用来自我的请求的一些值开始一个新的意图。
这是我想做的事情的简单模式: 按登录按钮 -> 星标请求 -> 检查是否正常 -> 使用响应值启动新意图。
我看到Volley是用异步方式查询的。 这是我的代码:
boolean temp=false;
login.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
boolean temp=false;
if (!id.getText().toString().isEmpty() && !pw.getText().toString().isEmpty()) {
temp = verifyCredentials(v.getContext()); //Doesn't work because Volley is asynchronous.
if(temp==true)
{
Intent intentMain = new Intent(v.getContext(), MainActivity.class);//MainActivity.class);
intentMain.putExtra("username", id.getText().toString());
startActivityForResult(intentMain, 0);
}
} else {//strighe vuote
//toast
Toast.makeText(v.getContext(), "Compila i campi", Toast.LENGTH_SHORT).show();
}
}
});
public boolean verifyCredentials(Context context) {
final boolean[] tempToReturn = {false};
mTextView = (TextView) findViewById(R.id.textView2);
RequestQueue queue = Volley.newRequestQueue(context);
StringRequest stringRequest = new StringRequest(Request.Method.POST, apiURL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
mTextView.setText("Response is:" + response.substring(500));
tempToReturn[0] =true;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
String json = null;
NetworkResponse response = error.networkResponse;
if(response != null && response.data != null){
switch(response.statusCode){
case 400:
json = new String(response.data);
json = trimMessage(json, "message");
if(json != null) displayMessage(json);
break;
}
//Additional cases
}
mTextView.setText("Error bad request");
}
public String trimMessage(String json, String key){
String trimmedString = null;
try{
JSONObject obj = new JSONObject(json);
trimmedString = obj.getString(key);
} catch(JSONException e){
e.printStackTrace();
return null;
}
return trimmedString;
}
//Somewhere that has access to a context
public void displayMessage(String toastString){
mTextView.setText("Response is:" +toastString);
}
}){
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
AuthenticationUserName = id.getText().toString();
AuthenticationPassword = pw.getText().toString();
params.put("grant_type", Authenticationgrant_type);
params.put("username", AuthenticationUserName);
params.put("password", AuthenticationPassword);
return params;
}
};
queue.add(stringRequest);
return tempToReturn[0];
}
我正在使用 Volley,因为我的 gradle 是 23,我的 APi 级别也是,所以我不能使用 apache 包。
编辑:新代码:
public void onClick(View v) {
boolean temp = true;
if (!id.getText().toString().isEmpty() && !pw.getText().toString().isEmpty()) {
myContext = v.getContext();
VolleyResponseListener listener = new VolleyResponseListener() {
@Override
public void onError(VolleyError error) {
String json = null;
NetworkResponse response = error.networkResponse;
if(response != null && response.data != null){
switch(response.statusCode){
case 400:
json = new String(response.data);
json = trimMessage(json, "message");
if(json != null) displayMessage(json);
break;
}
//Additional cases
}
mTextView.setText("Error bad request");
}
@Override
public void onResponse(JSONObject response) {
try {
fullName = response.getString("fullName");
token= response.getString("access_token");
expirationDate=response.getString(".expires");
} catch (JSONException e) {
e.printStackTrace();
}
mTextView.setText("Response is:" + fullName+token+expirationDate);
Intent intentMain = new Intent(myContext, MainActivity.class);//MainActivity.class);
intentMain.putExtra("username", id.getText().toString());
startActivityForResult(intentMain, 0);
}
public String trimMessage(String json, String key){
String trimmedString = null;
try{
JSONObject obj = new JSONObject(json);
trimmedString = obj.getString(key);
} catch(JSONException e){
e.printStackTrace();
return null;
}
return trimmedString;
}
//Somewhere that has access to a context
public void displayMessage(String toastString){
//Toast.makeText(MainActivity.this, toastString, Toast.LENGTH_LONG).show();
mTextView.setText("Response is:" +toastString);
}
};
verifyCredentials(myContext,listener);
我已经创建了这个界面:
public interface VolleyResponseListener {
void onError(VolleyError error);
void onResponse(JSONObject response);
}
这是我的验证凭证的新代码:
public boolean verifyCredentials(Context context,final VolleyResponseListener listener) {
final boolean[] tempToReturn = {false};
mTextView = (TextView) findViewById(R.id.textView2);
Map<String,String> params = new HashMap<String, String>();
AuthenticationUserName = id.getText().toString();
AuthenticationPassword = pw.getText().toString();
//key value
params.put("grant_type", Authenticationgrant_type);
params.put("username", AuthenticationUserName);
params.put("password", AuthenticationPassword);
RequestQueue queue = Volley.newRequestQueue(context);
SimpleRequest jsObjRequest = new SimpleRequest(Request.Method.POST, apiURL,
params,new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
listener.onResponse(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onError(error);
}
}
});
queue.add(jsObjRequest);
return tempToReturn[0];
}
我已经回答了一些看起来像您的问题的问题,例如:
您不应该等待那个布尔值 return。相反,您可以尝试以下方式(当然,您可以将 JSONArray
请求替换为 JSONObject
或 String
请求):
VolleyResponseListener listener = new VolleyResponseListener() {
@Override
public void onError(String message) {
// do something...
}
@Override
public void onResponse(Object response) {
// do something...
}
};
makeJsonArrayRequest(context, Request.Method.POST, url, requestBody, listener);
makeJsonArrayRequest
的正文可以如下:
public void makeJsonArrayRequest(Context context, int method, String url, String requestBody, final VolleyResponseListener listener) {
JSONObject jsonRequest = null;
try {
...
if (requestBody != null) {
jsonRequest = new JSONObject(requestBody);
}
...
} catch (JSONException e) {
e.printStackTrace();
}
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(method, url, jsonRequest, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray jsonArray) {
listener.onResponse(jsonArray);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onError(error.toString());
}
});
// Access the RequestQueue through singleton class.
MySingleton.getInstance(context).addToRequestQueue(jsonArrayRequest);
}
VolleyResponseListener
界面如下:
public interface VolleyResponseListener {
void onError(String message);
void onResponse(Object response);
}
请在下方留言:
first of all is: the "order" of the method, for example in my case, After pressing button, which method I have to call?
假设我们在 onCreate
里面:
您可以先创建VolleyResponseListener listener
,然后在按下按钮时调用verifyCredentials(..., listener);
。
And where I can call the intent?
上面VolleyResponseListener listener
的onResponse
里面会调用这个(当然里面可以根据自己的需求查看更多的条件)
Second: I have to send a String but I want a jsonArrayRespond, there is a method to do this? Or it work only with 2 kind of parameter such string request/string sent and json request/json sent?
根据Google's training documentation:
- StringRequest:指定 URL 并接收 原始字符串作为响应。
- ImageRequest:指定 URL 并接收 图像作为响应。
- JsonObjectRequest 和 JsonArrayRequest(都是 JsonRequest): 指定一个URL并得到一个JSON对象或array (分别)回应.
当然,对于没有开箱即用的 Volley 支持的类型,您可以实现自己的自定义请求类型。看看Implementing a Custom Request.
希望对您有所帮助!