当前位置: 首页 > 知识库问答 >
问题:

Android改造不适用于Laravel APIendpoint

广宏远
2023-03-14

我一直在发疯,想弄明白为什么最终的android改造没有发送帖子。这就是我所做的。在Laravel中,我设置了模型controller,更改了VerifyCsrfToken以允许api。然后设置路由web和api。所有这些都是通过邮递员测试的,而且都是有效的,但当我尝试通过android发布时,代码失败了。

这是我给Laravel的路线

网状物php

Route::get('/', function () {
return view('welcome');
});

Route::resource('/api/student', 'StudentsApiController');

应用程序编程接口。php

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

Route::post('student/store', 'StudentsApiController@store');

Androidapi.java

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

public interface Api {

    @FormUrlEncoded
    @POST("store")
    public Call<ResponseBody> store(
        @Field( "email" ) String email,
        @Field ( "password" ) String password,
        @Field ( "name" ) String name,
        @Field ( "school" ) String school
    );

}

Android-改装客户端。Java语言

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public
class RetrofitClient {

    private static final String BASE_URL = "192.168.2.23/api/student/";
    private static RetrofitClient mInstance;
    private Retrofit retrofit;

    private RetrofitClient()
    {
        retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory ( GsonConverterFactory.create () )
            .build ();
    }

    public static synchronized RetrofitClient getmInstance(){
        if(mInstance == null){
            mInstance = new RetrofitClient ();
        }
        return mInstance;
    }

    public Api getApi(){
        return retrofit.create ( Api.class );

    }
}

Android-主要活动。Java语言

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Patterns;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.IOException;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public
class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText editTextEmail, editTextPassword, editTextName, editTextSchool;

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

        editTextEmail = findViewById ( R.id.editTextEmail );
        editTextPassword = findViewById ( R.id.editTextPassword );
        editTextName = findViewById ( R.id.editTextName );
        editTextSchool = findViewById ( R.id.editTextSchool );

        findViewById ( R.id.buttonSignUp ).setOnClickListener ( this );

        findViewById ( R.id.textViewLogin ).setOnClickListener ( this );

    }

    private
    void userSignUp () {
        String email = editTextEmail.getText ( ).toString ( ).trim ( );
        String password = editTextPassword.getText ( ).toString ( ).trim ( );
        String name = editTextName.getText ( ).toString ( ).trim ( );
        String school = editTextSchool.getText ( ).toString ( ).trim ( );

        if (email.isEmpty ( )) {
            editTextEmail.setError ( "Email required" );
            editTextEmail.requestFocus ( );
            return;
        }

        if (Patterns.EMAIL_ADDRESS.matcher ( email ).matches ( )) {
            editTextEmail.setError ( "Email a valid email" );
            editTextEmail.requestFocus ( );
            return;
        }

        if (password.isEmpty ( )) {
            editTextPassword.setError ( "Password is required" );
            editTextPassword.requestFocus ( );
            return;
        }
        if (password.length ( ) < 6) {
            editTextPassword.setError ( "Password should be 6 characters long" );
            editTextPassword.requestFocus ( );
            return;
        }
        if (name.isEmpty ( )) {
            editTextName.setError ( "Name is required" );
            editTextName.requestFocus ( );
            return;
        }
        if (school.isEmpty ( )) {
            editTextSchool.setError ( "Name is required" );
            editTextSchool.requestFocus ( );
            return;
        }


    }

    @Override
    public
    void onClick ( View v ) {
        switch (v.getId ( )) {
            case R.id.buttonSignUp:
                userSignUp ( );
                break;
            case R.id.textViewLogin:
                break;
        }

        Call <ResponseBody> call = RetrofitClient
                .getmInstance ()
                .getApi ()
                .store("email", "password", "name", "school");

        call.enqueue ( new Callback <ResponseBody> ( ) {
            @Override
            public
            void onResponse ( Call <ResponseBody> call, Response<ResponseBody> response ) {
                try {
                    String s = response.body ().string ();
                    Toast.makeText ( MainActivity.this, s, Toast.LENGTH_LONG ).show ();
                } catch (IOException e) {
                    e.printStackTrace ( );
                }



            }

            @Override
            public
            void onFailure ( Call <ResponseBody> call, Throwable t ) {

                Toast.makeText ( MainActivity.this, t.getMessage (), Toast.LENGTH_LONG ).show ();

            }
        } );


    }
}

我还更改了清单文件以包含Internet权限。我使用Vysor进行测试。

共有3个答案

郭远
2023-03-14

您已经提供

BASE_URL中的学生endpoint。像这样更改您的BASE_URL

私有静态最终字符串BASE\u URL=“192.168.2.23/api/”

韩晋
2023-03-14

试着改变这一点

Route::post('student/store', 'StudentsApiController@store');

Route::post('/store', 'StudentsApiController@store');
百里丁雨
2023-03-14

改造中的基本url将删除第一个/之后的所有内容,因此您的基本url应该只包含您的ip并在您的android api文件中@post('store')应该是@post('api/学生/store')base_url="http://192.168.1.6"只是举个例子

 类似资料:
  • 问题内容: 我在运行Android 4.3的仿真器上使用Retrofit时遇到问题,并且设备在Android 4.4.2上运行,而相同的代码在运行Android 7.1.1的另一个仿真器上正常运行 每次尝试执行请求时,都会收到超时异常。 代码如下 和对api的调用 问题答案: 它显示为,起初建议提高客户端的连接超时值,正如在此答案中所解释的- 但在查看…的当前源代码时,这提示不兼容的协议。 服务器

  • “技术人员”之前的简报对改装并不陌生,但我遇到了这种奇怪的行为,我很难理解和修复。我有两个web服务,在Postman和iOS中都能正常工作,但只有一个在改装中工作,而另一个不工作, 为我辩护,我可以说我得到了(未经授权的)响应,这意味着我能够点击服务器并得到API开发者辩护的结果,他说它在邮递员和其他设备中工作,所以不是服务问题 如果有改装专家告诉我,为了得到这个错误,我背后可能在做什么改装?

  • 问题内容: 我有这个代码: 当我滚动我的回收站视图时,出现此错误: 如何处理此错误并获得第一个可见项目的位置? 问题答案: 我用此代码对其进行了测试,并且对我来说效果很好 我使用了回收视图参数。

  • DownloadManager在Android 8.0上不工作。我不知道为什么。有人能帮我吗? 这就是我尝试过的:

  • 我想在我的移动应用程序中使用谷歌oauth授权。我之前已经在测试控制台应用中实现了此功能。但是,在我在 Xamarin Android中重新定位我的代码后,出现了一些问题。法典: 这是脏代码,但在控制台应用中执行得很好。当我尝试在 Xamarin 中启动方法时,我捕获异常: 无法启动带有“”的浏览器https://accounts.google.com/o/oauth2/v2/auth?acces

  • 我已经在中声明了材料主题。