Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用截击发送post请求和接收_Php_Android_Json_Http_Android Volley - Fatal编程技术网

在PHP中使用截击发送post请求和接收

在PHP中使用截击发送post请求和接收,php,android,json,http,android-volley,Php,Android,Json,Http,Android Volley,我试图在我的项目中使用volley来处理所有HTTP请求,因为据我所知,它是最有效的一个。所以我开始学截击,就是按照这个 我的第一个GET请求成功了。然后我继续发布请求,但失败了。我在堆栈溢出上看到许多人在将截击的post请求与PHP结合起来时遇到问题。我相信我们无法使用正常的方式访问它,即$\u POST[“”],因为volley会向我们指定的URL发送一个JSON对象 我尝试了很多解决方案,但都没有成功。我想应该有一个简单和标准的方法来使用PHP的截击。因此,我想知道我需要做什么才能在PHP

我试图在我的项目中使用volley来处理所有HTTP请求,因为据我所知,它是最有效的一个。所以我开始学截击,就是按照这个

我的第一个GET请求成功了。然后我继续发布请求,但失败了。我在堆栈溢出上看到许多人在将截击的post请求与PHP结合起来时遇到问题。我相信我们无法使用正常的方式访问它,即
$\u POST[“”]
,因为volley会向我们指定的URL发送一个JSON对象

我尝试了很多解决方案,但都没有成功。我想应该有一个简单和标准的方法来使用PHP的截击。因此,我想知道我需要做什么才能在PHP代码中接收截获发送的json对象

还有,我如何检查volley是否真的发送了JSON对象

发送简单post请求的我的截击代码:

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
                url, null,
                new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d(TAG, response.toString());
                        pDialog.hide();
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        pDialog.hide();
                    }
                }) {

            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("name", "Droider");
                return params;
            }

        };

// Adding request to request queue
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
<?php
$name = $_POST["name"];

$j = array('name' =>$name);
echo json_encode($j);
?>
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {JSONObject jsonObject = new JSONObject(response);
            } catch (JSONException ignored) {
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            if (volleyError instanceof TimeoutError) {
            }
        }
    }) {
        @Override
        public Map<String, String> getParams() throws AuthFailureError {
            HashMap<String, String> params = new HashMap<>();
            params.put("name", "Droider");
            return params;
        }

        @Override
        public Priority getPriority() {
            return Priority.IMMEDIATE;
        }
    };
    ApplicationController.getInstance().addToRequestQueue(stringRequest);
<?php
   $name = $_POST["name"];
   $j = array('name' =>$name);
   echo json_encode($j);
?>
编辑(感谢格鲁吉亚Benetatos的正确方式)

我创建了您提到的类,类名为
CustomRequest
,如下所示:

import java.io.UnsupportedEncodingException;
import java.util.Map;

import org.json.JSONException;
import org.json.JSONObject;

import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;

public class CustomRequest extends Request<JSONObject>{

      private Listener<JSONObject> listener;
      private Map<String, String> params;

      public CustomRequest(String url, Map<String, String> params,
                Listener<JSONObject> reponseListener, ErrorListener errorListener) {
            super(Method.GET, url, errorListener);
            this.listener = reponseListener;
            this.params = params;
      }

      public CustomRequest(int method, String url, Map<String, String> params,
                Listener<JSONObject> reponseListener, ErrorListener errorListener) {
            super(method, url, errorListener);
            this.listener = reponseListener;
            this.params = params;
        }

    @Override
    protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
      return params;
    };

    @Override
    protected void deliverResponse(JSONObject response) {
        listener.onResponse(response);
    }

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
         try {
                String jsonString = new String(response.data,
                        HttpHeaderParser.parseCharset(response.headers));
                return Response.success(new JSONObject(jsonString),
                        HttpHeaderParser.parseCacheHeaders(response));
            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (JSONException je) {
                return Response.error(new ParseError(je));
            }
    }

}

我自己也有很多问题,试试这个

public class CustomRequest extends Request<JSONObject> {

private Listener<JSONObject> listener;
private Map<String, String> params;

public CustomRequest(String url,Map<String, String> params, Listener<JSONObject> responseListener, ErrorListener errorListener) {
    super(Method.GET, url, errorListener);
    this.listener = responseListener;
    this.params = params;
}

public CustomRequest(int method, String url,Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) {
    super(method, url, errorListener);
    this.listener = reponseListener;
    this.params = params;
}

@Override
protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
    return params;
};

@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
    try {
        String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));

        return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JSONException je) {
        return Response.error(new ParseError(je));
    }
}

@Override
protected void deliverResponse(JSONObject response) {
    listener.onResponse(response);
}
你必须制作一张地图,地图支持键值类型,然后用截击发布。 在php中,您可以获得$variable=$\u POST[“key\u from\u map”]来检索$variable中的值 然后构建响应并对其进行json_编码

下面是一个php示例,说明如何查询sql并将应答作为JSON发回

$response["devices"] = array();

    while ($row = mysqli_fetch_array($result)) {


        $device["id"] = $row["id"];
        $device["type"] = $row["type"];


        array_push($response["devices"], $device);  
    }

    $response["success"] = true;
    echo json_encode($response);
您可以在这里看到响应类型是JSONObject

public CustomRequest(int method, String url,Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener)
publiccustomrequest(int方法、字符串url、映射参数、侦听器reponListener、ErrorListener)
看看监听器的参数

JSONObject params=new JSONObject();
JSONObject params = new JSONObject();
        try {
            params.put("name", "Droider");
        } catch (JSONException e) {
            e.printStackTrace();
        }
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
                url, params,
                new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d(TAG, response.toString());
                        pDialog.hide();
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        pDialog.hide();
                    }
                }) {

                 @Override
                 public Map<String, String> getHeaders() throws AuthFailureError {
                        HashMap<String, String> headers = new HashMap<String, String>();
                        headers.put("Content-Type", "application/json; charset=utf-8");
                        return headers;  
                 } 

        };

// Adding request to request queue
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
试一试{ 参数put(“名称”、“机器人”); }捕获(JSONException e){ e、 printStackTrace(); } JsonObjectRequest JSONObjectReq=新的JsonObjectRequest(Method.POST, url,参数, 新的Response.Listener(){ @凌驾 公共void onResponse(JSONObject响应){ Log.d(TAG,response.toString()); pDialog.hide(); } },new Response.ErrorListener(){ @凌驾 公共无效onErrorResponse(截击错误){ d(标记“Error:+Error.getMessage()); pDialog.hide(); } }) { @凌驾 公共映射getHeaders()引发AuthFailureError{ HashMap headers=新的HashMap(); headers.put(“内容类型”、“应用程序/json;字符集=utf-8”); 返回标题; } }; //将请求添加到请求队列 AppController.getInstance().addToRequestQueue(jsonObjReq,tag_json_obj);
在服务器端:

<?php
     $value = json_decode(file_get_contents('php://input'));
     $file = 'MyName.txt';
     file_put_contents($file, "The received name is {$value->name} ", FILE_APPEND | LOCK_EX);    
?>


打开
MyName.txt
并查看结果。

下面是一个简单的代码,用于向php脚本发送post请求

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private static final String REGISTER_URL = "http://simplifiedcoding.16mb.com/UserRegistration/volleyRegister.php";

public static final String KEY_USERNAME = "username";
public static final String KEY_PASSWORD = "password";
public static final String KEY_EMAIL = "email";


private EditText editTextUsername;
private EditText editTextEmail;
private EditText editTextPassword;

private Button buttonRegister;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    editTextUsername = (EditText) findViewById(R.id.editTextUsername);
    editTextPassword = (EditText) findViewById(R.id.editTextPassword);
    editTextEmail= (EditText) findViewById(R.id.editTextEmail);

    buttonRegister = (Button) findViewById(R.id.buttonRegister);

    buttonRegister.setOnClickListener(this);
}

private void registerUser(){
    final String username = editTextUsername.getText().toString().trim();
    final String password = editTextPassword.getText().toString().trim();
    final String email = editTextEmail.getText().toString().trim();

    StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG).show();
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();
                }
            }){
        @Override
        protected Map<String,String> getParams(){
            Map<String,String> params = new HashMap<String, String>();
            params.put(KEY_USERNAME,username);
            params.put(KEY_PASSWORD,password);
            params.put(KEY_EMAIL, email);
            return params;
        }

    };

    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}

@Override
public void onClick(View v) {
    if(v == buttonRegister){
        registerUser();
    }
}
}
public类MainActivity扩展AppCompatActivity实现View.OnClickListener{
专用静态最终字符串寄存器\u URL=”http://simplifiedcoding.16mb.com/UserRegistration/volleyRegister.php";
公共静态最终字符串键\u USERNAME=“USERNAME”;
公共静态最终字符串密钥\u PASSWORD=“PASSWORD”;
公共静态最终字符串键\u EMAIL=“EMAIL”;
私有EditText editTextUsername;
私人编辑文本编辑电子邮件;
私人编辑文本编辑密码;
私人按钮注册表;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextUsername=(EditText)findViewById(R.id.editTextUsername);
editTextPassword=(EditText)findViewById(R.id.editTextPassword);
editTextEmail=(EditText)findViewById(R.id.editTextEmail);
buttonRegister=(按钮)findViewById(R.id.buttonRegister);
buttonRegister.setOnClickListener(此);
}
私有无效注册器(){
最终字符串用户名=editTextUsername.getText().toString().trim();
最终字符串密码=editTextPassword.getText().toString().trim();
最终字符串email=editTextEmail.getText().toString().trim();
StringRequest StringRequest=新建StringRequest(Request.Method.POST,REGISTER\u URL,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG.show();
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG.show();
}
}){
@凌驾
受保护的映射getParams(){
Map params=新的HashMap();
参数put(KEY_用户名、用户名);
参数put(钥匙密码、密码);
参数put(钥匙、电子邮件、电子邮件);
返回参数;
}
};
RequestQueue RequestQueue=Volley.newRequestQueue(this);
添加(stringRequest);
}
@凌驾
公共void onClick(视图v){
如果(v==按钮注册表){
registerUser();
}
}
}
volleyRegister.php

<?php

if($_SERVER['REQUEST_METHOD']=='POST'){
    $username = $_POST['username'];
    $email = $_POST['email'];
    $password = $_POST['password'];

    require_once('dbConnect.php');

    $sql = "INSERT INTO volley (username,password,email) VALUES ('$username','$email','$password')";


    if(mysqli_query($con,$sql)){
        echo "Successfully Registered";
    }else{
        echo "Could not register";

    }
}else{
echo 'error'}
}

始终将StringRequest与截取一起使用,因为如果JSON被损坏或格式不正确,从服务器获取响应是更安全的方法

ANDROID代码:

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
                url, null,
                new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d(TAG, response.toString());
                        pDialog.hide();
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        pDialog.hide();
                    }
                }) {

            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("name", "Droider");
                return params;
            }

        };

// Adding request to request queue
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
<?php
$name = $_POST["name"];

$j = array('name' =>$name);
echo json_encode($j);
?>
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {JSONObject jsonObject = new JSONObject(response);
            } catch (JSONException ignored) {
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            if (volleyError instanceof TimeoutError) {
            }
        }
    }) {
        @Override
        public Map<String, String> getParams() throws AuthFailureError {
            HashMap<String, String> params = new HashMap<>();
            params.put("name", "Droider");
            return params;
        }

        @Override
        public Priority getPriority() {
            return Priority.IMMEDIATE;
        }
    };
    ApplicationController.getInstance().addToRequestQueue(stringRequest);
<?php
   $name = $_POST["name"];
   $j = array('name' =>$name);
   echo json_encode($j);
?>
StringRequest-StringRequest=new-StringRequest(Request.Method.POST,URL,new-Response.Listener()){
@凌驾
公共void onResponse(字符串响应){
尝试{JSONObject JSONObject=newjsonobject(响应);
}捕获(忽略JSONException){
}
}
<?php
   $name = $_POST["name"];
   $j = array('name' =>$name);
   echo json_encode($j);
?>
public class LoginActivity extends AppCompatActivity {

    private EditText Email;
    private EditText Password;
    private String URL = "http://REPLACE ME WITH YOUR URL/login.php";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        TextView register = (TextView) findViewById(R.id.Register);
        TextView forgotten = (TextView) findViewById(R.id.Forgotten);
        Button login = (Button) findViewById(R.id.Login);
        Email = (EditText) findViewById(R.id.Email);
        Password = (EditText) findViewById(R.id.Password);
        Password.setImeOptions(EditorInfo.IME_ACTION_DONE);

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RequestQueue MyRequestQueue = Volley.newRequestQueue  (LoginActivity.this);
                MyRequestQueue.add(MyStringRequest);
            }
        });
    }

StringRequest MyStringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            Toast.makeText(getApplicationContext(),response.trim(), Toast.LENGTH_SHORT).show();
        }

    }, new Response.ErrorListener() { //Create an error listener to handle errors appropriately.
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getApplicationContext(),error.toString().trim(), Toast.LENGTH_LONG).show();
        }
    }) {
        protected Map<String, String> getParams() {
            final String email = Email.getText().toString().trim();
            final String password = Password.getText().toString().trim();

            Map<String, String> MyData = new HashMap<String, String>();
            MyData.put("email", email);
            MyData.put("password", password);
            return MyData;
        }
     };
 }
<?php
    $message = $_POST["email"];
    echo $message;
?>