【问题标题】:android retrofit 2 post to laravel not workingandroid改造2发布到laravel不起作用
【发布时间】:2020-10-26 23:43:30
【问题描述】:

我正在使用改造 2,尝试将数据发送到我的 laravel 网络。

InitRetrofit.java

public class InitRetrofit {
    public static String API_URL = "http://192.168.1.2/sra-copy/public/";
    public static Retrofit setInit(){
        return new Retrofit.Builder().baseUrl(API_URL).addConverterFactory(GsonConverterFactory.create()).build();
    }

    public static ApiService getInstance(){
        return setInit().create(ApiService.class);
    }
}

ApiService.java

public interface ApiService {
    @FormUrlEncoded
    @POST("lapor/android")
    Call<ResponseLapor> input(@Field("lat") String lat,
                              @Field("lng") String lng,
                              @Field("jenis") String jns,
                              @Field("keterangan") String ket);
}

响应类 ResponseLapor.java

public class ResponseLapor {
    @SerializedName("message")
    @Expose
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message){
        this.message = message;
    }
}

调用改造

public void lapor(){
    lat = etLat.getText().toString();
    lng = etLng.getText().toString();
    keterangan = etKet.getText().toString();
    jns = "Ringan";

    ApiService api = InitRetrofit.getInstance();

    retrofit2.Call<ResponseLapor> call = api.input(lat, lng, jns, keterangan);
    call.enqueue(new Callback<ResponseLapor>() {
        @Override
        public void onResponse(retrofit2.Call<ResponseLapor> call, Response<ResponseLapor> response) {
            String message = response.body().getMessage();
            Toast.makeText(Lapor.this, message, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(retrofit2.Call<ResponseLapor> call, Throwable t) {
            Toast.makeText(Lapor.this, "Jaringan Error! "+t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

路线

Route::post('lapor/android', 'AndroidController@Lapor')->name('android.lapor');

控制器

public function Lapor(Request $request){
    // dd($request->all());
    $msg = array();
    if($request->jenis == "Ringan"){
        $rs = RumahSakit::select(DB::raw('*, ( 6367 * acos( cos( radians('.$request->lat.') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('.$request->lng.') ) + sin( radians('.$request->lat.') ) * sin( radians( lat ) ) ) ) AS distance'))->having('distance', '<', 25)->orderBy('distance')->get();
        DB::table('status')->insert([
            'nama_sts' => $rs->first()->nama_rs,
            'keterangan' => $request->keterangan,
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s')
        ]);

        $msg["message"] = $rs->first()->nama_rs;
    }
    else{
        $msg["message"] = "Error Jenis Laporan";
    }
    echo json_encode($msg);
}

控制器在尝试从网络插入时工作。 当我第一次发送数据时,它没有显示任何 toast,然后我第二次收到此错误:

"java.lang.NullPointerException: Attempt to invoke virtual method java.lang.String com.example.sra.response.ResponseLapor.getMessage()' on a null object reference

我认为错误与 URL 有关,因为我有另一个使用相同结构的 android 项目,并且它成功地将数据插入到 localhost(不是 laravel)只是原生 PHP。

【问题讨论】:

  • 你如何将你的 laravel 变成一个 web 服务器? xampp、iis 还是 php artisan serve?
  • @Kelvin 尝试同时使用 localhost(在代码中带有 url)和来自 php artisan serve 的 ip,两者都没有工作
  • 如果我使用127.0.0.1:8000 (php artisan serve),它说连接失败
  • 如果您使用 php artisan serve,它将在本地使用端口 8000 提供服务,并且您需要在该本地 IP 地址上的端口 8000 上允许防火墙,以便其他 LAN 可以使用该端口。然后访问ip地址192.168.1.2:8000
  • 还要确保在编译程序之前使用端口访问 ip,使用 cmd ping 192.168.1.2:8000 进行检查的简单方法

标签: java php android laravel retrofit2


【解决方案1】:

更新
我终于从尝试使用 Postman 发布时发现它给出了错误 419 Page Expired,因为它没有 csrf 令牌(因为我直接将它发布到控制器而没有查看我可以添加 csrf 到),
所以我在中间件文件夹中的 VerifyCsrfToken.php 上添加了 url 的异常,所以它变成了这样

class VerifyCsrfToken extends Middleware
{
    /**
     * Indicates whether the XSRF-TOKEN cookie should be set on the response.
     *
     * @var bool
     */
    protected $addHttpCookie = true;

    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        //
        '/lapor/android'
    ];
}

也许还有另一种方法可以做到这一点,例如在控制器内生成 csrf 令牌。
希望这会对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 2018-02-04
    • 1970-01-01
    • 2018-02-13
    • 2014-02-28
    • 2020-07-15
    • 2016-12-17
    • 2014-10-02
    相关资源
    最近更新 更多