java - 使用 Volley 发布数据的最简单方法是什么?
问题描述
我正在尝试使用 Volley 将 3 个字符串发送到 php 脚本,该脚本将其发送到 localhost 服务器。到目前为止我有这个;
注册请求;
public class RegisterRequest extends StringRequest {
private static final String REGISTER_REQUEST_URL = "http://192.168.*.*:80/phptesting/Register.php";
private Map<String, String> params;
public RegisterRequest(String username, String password,String isAdmin,
Response.Listener<String> listener,
Response.ErrorListener errListener){
super(Method.POST, REGISTER_REQUEST_URL,listener,errListener);
params = new HashMap<>();
params.put("username",username);
params.put("password",password);
params.put("isAdmin",isAdmin+"");
}
public Map<String, String> getparams() {
return params;
}
}
这是创建用户;
public class CreateUser extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_user);
this.setTitle("Create User");
final EditText username1 = findViewById(R.id.Createusername);
final EditText password1 = findViewById(R.id.CreatePassword);
final Switch isAdmin = findViewById(R.id.isadmin);
final Button createuser = findViewById(R.id.createuserbtn);
if (getIntent().hasExtra("com.example.northlandcaps.crisis_response")){
isAdmin.setVisibility(View.GONE);
}
createuser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String username = username1.getText().toString();
final String password = password1.getText().toString();
final String isadmin = isAdmin.getText().toString();
Response.Listener<String> responseListener = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("Response Value: ", response);
if (response.equals("success")){
Intent intent = new Intent(CreateUser.this, MainActivity.class);
CreateUser.this.startActivity(intent);
}else{
AlertDialog.Builder builder = new AlertDialog.Builder(CreateUser.this);
builder.setMessage("Register Failed")
.setNegativeButton("Retry",null)
.create()
.show();
}
}
};Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(), String.valueOf(error), Toast.LENGTH_SHORT).show();
}
};
RegisterRequest registerRequest = new RegisterRequest(username,password,isadmin,responseListener,errorListener);
RequestQueue queue = Volley.newRequestQueue(CreateUser.this);
queue.add(registerRequest);
}
});
}
现在,我得到的唯一错误是未定义的索引。那是因为 Volley 没有将数据发送到 php 脚本。将数据发送到 php 脚本时,它确实可以正常工作,所以我的问题是这样的;我必须对我的脚本进行哪些更改才能发送 3 个字符串?
解决方案
永远不要乱用代码,否则会让你无法正确处理事情。
因此,只需创建另一个课程并在您的活动中使用它。
看看我写的这个类,你可以在任何地方和任何类型的数据请求中使用它。
public class SendData {
private Context context;
private String url;
private HashMap<String, String> data;
private OnDataSent onDataSent;
public void setOnDataSent(OnDataSent onDataSent) {
this.onDataSent = onDataSent;
}
public SendData(Context context, String url, HashMap<String, String> data) {
this.context = context;
this.url = url;
this.data = data;
}
public void send(){
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if(onDataSent != null){
onDataSent.onSuccess(response);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if(onDataSent != null){
onDataSent.onFailed(error.toString());
}
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<>();
map.putAll(data);
return map;
}
};
stringRequest.setRetryPolicy(new DefaultRetryPolicy(0, 0, 0));
RequestQueue requestQueue = Volley.newRequestQueue(context);
requestQueue.add(stringRequest);
}
public interface OnDataSent{
void onSuccess(String response);
void onFailed(String error);
}
}
现在您可以轻松地在任何活动中使用它。只需在构造函数中提供数据并使用接口以这种方式跟踪事件
HashMap<String, String> data = new HashMap<>();
data.put("username", "");//define the value
data.put("password", "");//define the value
data.put("is_admin", "");//define the value
SendData sendData = new SendData(this, "", data); //defie the context and url properly
sendData.setOnDataSent(new SendData.OnDataSent() {
@Override
public void onSuccess(String response) {
//parse the response
}
@Override
public void onFailed(String error) {
//something went wrong check the error
}
});
sendData.send();
希望能帮助到你
快乐编码
如果出现一些问题让我知道:)
推荐阅读
- r - How to colour lines in vegan's rarecurve by factors?
- azure - 具有 IP 范围限制的 Azure Blob SAS
- algorithm - Specifying starting point for graph traversal algorithm in neo4j
- batch-file - How to answer automatically (Y/N) when prompt?
- c# - Oracle table getting locked when trying to write out a clob
- javascript - 如何使我的本地主机服务器可用于外部请求?
- r - 是否有直接进入包的功能索引帮助页面的命令?
- java - 交易传播问题
- javascript - 仅在执行完异步函数后如何转到循环中的下一项?
- php - 如何使用新方法扩展 PDO 类并在另一个类中使用该方法?