我一直在发疯,想弄明白为什么最终的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
进行测试。
您已经提供
BASE_URL
中的学生endpoint。像这样更改您的BASE_URL
:
私有静态最终字符串BASE\u URL=“192.168.2.23/api/”
试着改变这一点
Route::post('student/store', 'StudentsApiController@store');
到
Route::post('/store', 'StudentsApiController@store');
改造中的基本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
我已经在中声明了材料主题。