gpt4 book ai didi

java - Retrofit2不发送POST数据

转载 作者:行者123 更新时间:2023-12-02 01:41:11 25 4
gpt4 key购买 nike

抱歉,如果我的英语不好!我使用 Retrofit 2 来接收依赖于 POST 数据的数据。我从服务器接收数据,但发送数据时遇到问题。我尝试使用不同的注释(@Field、@Body with Object、@Body with HashMap data),但它们都不起作用。这是我的 Java 代码:

build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 28
defaultConfig {
applicationId "com.test.retrofitpostdatagetjson"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'

implementation 'com.google.code.gson:gson:2.8.4'

implementation 'com.squareup.retrofit2:retrofit:2.5.0'

implementation 'com.squareup.retrofit2:converter-gson:2.5.0'

testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

APIClient.java

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

public class APIClient {
private static final String BASE_URL = "https://myurl.ru/";
private static Retrofit retrofit;

public static Retrofit getClient() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}

ApiUtils.java

public class ApiUtils {

private ApiUtils() {}

public static APIInterface getAPIService() {

return APIClient.getClient().create(APIInterface.class);
}
}

APIInterface.java

import com.test.retrofitpostdatagetjson.model.DataResponse;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;

public interface APIInterface {
@POST("test_json_with_post")
Call<DataResponse> createData(@Body DataResponse data);

}

DataResponse.java

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;

public class DataResponse implements Serializable {

@SerializedName("numb")
@Expose
private int numb;
@SerializedName("name")
@Expose
private String name;

@SerializedName("emp")
@Expose
public String value;
@SerializedName("status")
@Expose
public String status;

public DataResponse(int numb, String name) {
this.numb = numb;
this.name = name;
}

public int getNumb() {
return numb;
}

public String getName() {
return name;
}

public String getValue() {
return value;
}

public String getStatus() {
return status;
}

public void setNumb(int numb) {
this.numb = numb;
}

public void setName(String name) {
this.name = name;
}

public void setValue(String value) {
this.value = value;
}

public void setStatus(String status) {
this.status = status;
}

@Override
public String toString() {
return "DataResponse{" +
"numb=" + numb +
", name='" + name + '\'' +
", value='" + value + '\'' +
", status='" + status + '\'' +
'}';
}
}

MainActivity.java

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import com.test.retrofitpostdatagetjson.api.APIInterface;
import com.test.retrofitpostdatagetjson.model.DataResponse;
import static com.test.retrofitpostdatagetjson.api.ApiUtils.getAPIService;

public class MainActivity extends AppCompatActivity {

APIInterface apiInterface;
int numb = 0;
String name = "test row";

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

if (CommonMethod.isNetworkAvailable(MainActivity.this))
sendPost(numb, name);
else
CommonMethod.showAlert("Internet Connectivity Failure", MainActivity.this);

}

private void sendPost(int numb, String name) {

final DataResponse data = new DataResponse(numb, name);
Log.w("retroTest", "sent --> " + data.toString());
Call<DataResponse> call1 = apiInterface.createData(data);
call1.enqueue(new Callback<DataResponse>() {
@Override
public void onResponse(Call<DataResponse> call, Response<DataResponse> response) {
DataResponse dataResponse = response.body();
if (dataResponse != null) {
Log.w("retroTest", "received --> " + dataResponse.toString());
}
}

@Override
public void onFailure(Call<DataResponse> call, Throwable t) {
Toast.makeText(getApplicationContext(), "onFailure called ", Toast.LENGTH_SHORT).show();
call.cancel();
}
});
}

}

这是我的日志:

W/retroTest: sent  -->  DataResponse{numb=0, name='test row', value='null', status='null'}
W/retroTest: received --> DataResponse{numb=0, name='null', value='null', status='2'}

服务器上我的 PHP 文件:

<?php
header("Content-type: application/json; charset=utf-8");

$inputJSON = file_get_contents('php://input');
$input = json_decode($inputJSON, TRUE);

$numb = $input['numb'];
$name = $input['name'];

if (isset($_POST['numb']) && !empty($_POST['numb'])) {
$numb = $_POST['numb']; }
if (isset($_POST['name']) && !empty($_POST['name'])) {
$name = $_POST['name']; }

if (!$numb) {
$json = json_encode( array(
"emp" => $name,
"status" => "2"));
} else {
$json = json_encode( array(
"emp" => "nothing",
"status" => "2"));
}

$myfile = fopen("testfile.txt", "w");
fwrite($myfile, $inputJSON);
fwrite($myfile, "\n");
fwrite($myfile, $numb);
fwrite($myfile, "\n");
fwrite($myfile, $name);
fclose($myfile);


echo $json;
?>

文件 testfile.txt 也是空的,但是当我尝试通过 Postman 发送 POST 时,一切正常! enter image description here enter image description here

最佳答案

我已经找到了问题的原因.. 很简单.. 都是关于网址末尾的斜杠。我使用index.php,所以当我发送POST到我的url地址时,我应该用斜杠结束它。

而是这样:

 @POST("test_json_with_post")

我应该这样写:

 @POST("test_json_with_post/")

在我的 APIInterface.java 中。一切正常!

希望,有一天它能帮助别人)

关于java - Retrofit2不发送POST数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54439896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com