尝试使用 Android Volley 发送 POST 请求到 Laravel

4

我将使用laravel 5.1进行数据库连接,并从Android发送POST请求表单到Laravel,但是异常显示“服务器错误”。

这是我的Android代码:

package com.example.ankit.postrequest;

import android.app.DownloadManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

public class DataSent extends AppCompatActivity {

    private static final String KEY_USERNAME ="rohit" ;
    private static final String KEY_PASSWORD ="1234" ;
    private static final String KEY_EMAIL ="a@gmail.com" ;
    private static final String KEY_token ="xyz" ;
    EditText Etname,Etpass,Etmail,Et_token;
    RequestQueue insert;
    String insertUrl ="http://memorableshaadi.com/j";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Etmail = (EditText)findViewById(R.id.activity_booking_form_email);
        Etname = (EditText)findViewById(R.id.activity_booking_form_name);
        Etpass = (EditText)findViewById(R.id.activity_booking_form_dow);
        Et_token = (EditText)findViewById(R.id.activity_booking_form_token);
    }

    public void call(View v) {
          registerUser();
    }

    private void registerUser(){
        final String username = Etname.getText().toString().trim();
        final String password = Etpass.getText().toString().trim();
        final String email = Etmail.getText().toString().trim();
        final String token = Ettoken.getText().toString().trim();

        StringRequest stringRequest = new StringRequest(Request.Method.POST, insertUrl,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Toast.makeText(DataSent.this, response, Toast.LENGTH_LONG).show();
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(DataSent.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);
                params.put(KEY_token, token);
                return params;
            }

        };

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

}

Laravel 路由

<?php

Route::post('users','JsonController@data');

laravel JsonController.php

   <?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Support\Facades\Mail;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use DB;
use File;
use Storage;
use response;
use Illuminate\Contracts\Routing\ResponseFactory;
class JsonController extends Controller{
public function data(Request $dat){
            $user = $dat->username;
            $pass = $dat->password;
            $email = $dat->email;
            DB::table('user')->insert([
                    'user_name' => $user,
                    'user_email' => $pass, 
                    'user_password' => $email
            ]);
            echo($user.$pass.$email);
        }
}

你有其他错误信息吗?检查laravel.log文件,另外看起来你的安卓代码没有发送到正确的URL路径。 - Neo
1个回答

4

您需要注意两点: 第一:您面临的错误是: VerifyCsrfToken.php中的TokenMismatchException,原因是为了构建身份验证,任何请求都应该通过您的中间件,在Laravel中必须传递令牌,所以由于您使用的是post方法,您没有传递它,而且请求缺少了它,因此最简单的解决方法是将异常添加到您的App\Http\Middleware\VerifyCsrfToken.php中。

class VerifyCsrfToken extends BaseVerifier
{
/**
 * The URIs that should be excluded from CSRF verification.
 *
 * @var array
 */
protected $except = [
   /* Add here your URLs */ 
];
}

你的请求会正常工作,同时你可以使用这个库来处理令牌身份验证 jwt-auth。 不过,关于你的代码,有一些事情我需要提醒一下: 在你的安卓代码中:
private static final String KEY_USERNAME ="rohit" ;
private static final String KEY_PASSWORD ="1234" ;
private static final String KEY_EMAIL ="a@gmail.com" ;
private static final String KEY_token ="xyz" ;

这些键将用于将请求的值与检查函数的值进行匹配,因此您应该先将它们重命名为与API源完全相同的名称,否则检查函数将无法从任何请求获取值。因此,它们应该像这样:

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

I hope this will help you )


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接