2014-09-20 116 views
23

我想在我的项目中使用volley来处理我所有的HTTP请求,因为据我所知它是最高效的。所以我开始按照这个AndroidHive tutorial学习凌空。使用Volley发送帖子请求并在PHP中接收

我的第一个GET请求成功了。然后我转到POST请求,但失败了。我在Stack Overflow上看到很多人遇到了将抽象请求与PHP结合的问题。我相信我们无法使用$_POST[""]这种常规方式访问它,因为volley会将JSON对象发送到我们指定的URL。

我尝试了很多解决方案,但都没有成功。我想应该有一个简单和标准的方式使用PHP的抽象。所以我想知道为了接收我的PHP代码中由volley发送的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代码,即可获得JSON对象:(我敢肯定,这是错误的方式,我不是在PHP好)

<?php 
    $jsonReceiveData = json_encode($_POST); 
    echo $jsonReceivedData; 
?> 

我尝试很多接受JSON对象在PHP像这样的以及 echo file_get_contents('php://input');

01的方式

结果

null 

(感谢格鲁吉亚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)); 
      } 
    } 

} 

在我的活动中,我打电话给以下人员:

String url = some valid url; 
Map<String, String> params = new HashMap<String, String>(); 
params.put("name", "Droider"); 

CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, new Response.Listener<JSONObject>() { 

      @Override 
      public void onResponse(JSONObject response) { 
       try { 
        Log.d("Response: ", response.toString()); 
       } catch (JSONException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError response) { 
       Log.d("Response: ", response.toString()); 
      } 
     }); 
     AppController.getInstance().addToRequestQueue(jsObjRequest); 

我的PHP代码如下:

<?php 
$name = $_POST["name"]; 

$j = array('name' =>$name); 
echo json_encode($j); 
?> 

现在它返回正确的值:

Droider 
+0

您没有收到在PHP数据,使用$ username = $ _POST [“username”]; 其中$ _POST [“username”];是你的post参数的关键,这将返回值。 – 2014-09-20 12:48:53

+0

排除有PHP $ _POST ['']的问题,您可以使用此解决方案http://stackoverflow.com/a/32644310/3741698 – 2015-09-18 05:12:39

+0

<?php $ post = json_decode(file_get_contents(“php:// input”)) ,真);在抽动的情况下很好地工作。你不需要CustomRequest。 – miralong 2017-12-16 17:14:07

回答

15

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

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

$username = $_POST["username"]; 
$password = $_POST["password"]; 

echo json_encode($response); 

你必须做出一个地图,地图支持键值的类型,比你用后凌空。 在php中,你得到$ variable = $ _POST [“key_from_map”]来检索它在$变量中的值 然后你建立响应并对其进行json_encode。

下面是如何查询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); 

一个PHP例如你可以在这里看到,响应类型是JSONObject的

public CustomRequest(int method, String url,Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) 

看听众的参数!

+0

可以请你详细说明如何使用这个类。这将是非常有益的。谢谢:) – ik024 2014-09-20 12:21:53

+0

阅读编辑,我添加了php,你发出了一个像我发布的那样的请求(CustomRequest),params是post params,PHP部分是你如何获得post值以及如何回发响应。 – 2014-09-20 12:25:17

+0

这是一个jsonobject请求,返回Response.success(新的JSONObject(jsonString),HttpHeaderParser.parseCacheHeaders(response)); 只需用第二个构造函数创建一个新的CustomRequest实例,并将其添加到队列中即可。 – 2014-09-20 12:39:16

7
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); 

,并在您的服务器端:

<?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和看到的结果。

+0

如果您控制服务器端代码,这是最简单的答案。 PHP需要以'key = value&key2 = value2'格式提交的POST或GET数据来自动填充$ _POST或$ _GET。但是,Volley将数据提交为JSON。 'json_decode(file_get_contents(“php:// input”));'是访问这些数据的好方法。 – stackunderflow 2015-11-30 10:03:58

+0

通常我们会说大拇指,但今天我要说你的手:p ü保存我的希望和时间tanx – Adiii 2016-06-26 21:19:47

4

下面是一个简单的代码来POST请求发送到PHP脚本

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(); 
    } 
} 
} 

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'} 
} 

来源:Android Volley Post Request Tutorial

+0

$ _POST ['_____'];在服务器端,我们通过接收从客户端设备抽取的值的论据?是地图的关键还是地图的价值? plzz帮助..我 – 2017-07-14 08:02:36

1

始终使用StringRequest因为它是更安全的方式来获得服务器的响应,如果JSON损坏或格式不正确。

ANDROID CODE:

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> headers = new HashMap<>(); 
      headers.put("name", "Droider"); 
      return headers; 
     } 

     @Override 
     public Priority getPriority() { 
      return Priority.IMMEDIATE; 
     } 
    }; 
    ApplicationController.getInstance().addToRequestQueue(stringRequest); 

PHP代码:

<?php 
    $name = $_POST["name"]; 
    $j = array('name' =>$name); 
    echo json_encode($j); 
?> 
0

这工作对我很好,如果这有助于任何

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; 
     } 
    }; 
} 

the login.php 

<?php 
    $message = $_POST["email"]; 
    echo $message; 
?> 
相关问题