【问题标题】:How to properly POST data from Android App to PHP?如何正确地将数据从 Android 应用程序发布到 PHP?
【发布时间】:2019-12-05 13:03:55
【问题描述】:

我正在开发一个必须将用户数据发布到数据库的应用程序(登录名、密码、设备 ID、纬度和经度)。我正在尝试通过 PHP 发布它,但我收到错误 "End of input at line 1 column 1 path $".

我不确定我应该怎么做。

我试图用 gson 做一些事情,但它也不起作用。如果有人有任何想法,请告诉我... :)

这是我的 MainActivity 代码:

public void createPost(String loginStr, String passwordStr, String id_urzadzenia, double latitude, double longitude) throws IOException {
    Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://unpreached-courtesy.000webhostapp.com")
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();
    API ApiPlaceHolder = retrofit.create(API.class);

    Call<Post> call = ApiPlaceHolder
            .createPost(
                    loginStr,
                    passwordStr,
                    id_urzadzenia,
                    latitude,
                    longitude);

    call.enqueue(new Callback<Post>() {
        @Override
        public void onResponse(Call<Post> call, Response<Post> response) {
            if (!response.isSuccessful()) {
                Toast.makeText(MainActivity.this, "Code " + response.code(), Toast.LENGTH_SHORT).show();

            }

        }

        @Override
        public void onFailure(Call<Post> call, Throwable t) {
            Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_LONG).show();
            Toast.makeText(MainActivity.this, call.request().toString(), Toast.LENGTH_SHORT).show();
        }
    });

}

API接口代码:

public interface API {
    @FormUrlEncoded
    @POST("/dane.php")
        Call<Post> createPost (
                @Field("loginStr")String loginStr,
                @Field("passwordStr") String passwordStr,
                @Field("id_urzadzenia") String id_urzadzenia,
                @Field("latitude") double latitude,
                @Field("longitude") double longitude
                );
}

Post.java 类代码:

public class Post {
    private String loginStr;

    private String passwordStr;

    private String id_urzadzenia;

    private double latitude;
    private double longitude;

    public String getLoginStr() {
        return loginStr;
    }

    public void setLoginStr(String loginStr) {
        this.loginStr = loginStr;
    }

    public String getPasswordStr() {
        return passwordStr;
    }

    public void setPasswordStr(String passwordStr) {
        this.passwordStr = passwordStr;
    }

    public String getId_urzadzenia() {
        return id_urzadzenia;
    }

    public void setId_urzadzenia(String id_urzadzenia) {
        this.id_urzadzenia = id_urzadzenia;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }
}

还有我的 PHP:

    <?php header('Content-Type: application/json');



$con = mysqli_connect(DB_SERVER,DB_USER,DB_PASSWORD,DB_DATABASE);


$login = $_POST["loginStr"];
$id_urz = $_POST["id_urzadzenia"];
$dl_geo = $_POST["longitude"];
$sz_geo = $_POST["latitude"];
echo "Login użytkownika: " .$login . "\n";
echo "ID urządzenia: " . $id_urz . "\n";
echo "Szerokość geograficzna: " . $sz_geo . "\n";
echo "Długość geograficzna: " . $dl_geo . "\n";
date_default_timezone_get(Europe);
$godz =  date("H:i:s");
$sql = "INSERT INTO TABLE bartek (id_urzadzenia,szerokosc,dlugosc,data) VALUES ('".json_encode($id_urz)."','".json_encode($sz_geo)."','".json_encode($dl_geo)."','".$godz."'";

mysqli_query($con, $sql);
mysqli_close($con);
?>

【问题讨论】:

    标签: php android post retrofit


    【解决方案1】:

    试试这个

    在 Gradle 中

            implementation 'com.google.code.gson:gson:2.8.5'
            implementation 'com.squareup.retrofit2:retrofit:2.5.0'
            implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
            implementation 'com.squareup.okhttp3:logging-interceptor:3.5.0'    
    

    在接口例如:make RetrofitAPI.java

    
            public static PostService postService = null;
    
            public static PostService getService() {
              if (postService == null) {
                HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
                interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
                OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(interceptor).build();
    
                Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(base_url)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
                postService = retrofit.create(PostService.class);
    
               }
              return postService;
            }
            public interface API {
                @FormUrlEncoded
                @POST
                Call<Post> createPost(@Url String url,
                                           @Field("id_urzadzenia") String id_urzadzenia,
                        @Field("loginStr") String loginStr,
                        @Field("passwordStr") String passwordStr,
                        @Field("longitude") String longitude,
                        @Field("latitude") String latitude
                                           );
            }
    
    

    在 MainActivity 中

    public void createPost(String loginStr, String passwordStr, String id_urzadzenia, double latitude, double longitude) throws IOException {
         final Call<Post> call_api = RetrofitAPI.getService().createPost(url, id_urzadzenia, loginStr, passwordStr, longitude, latitude );
                call_api.enqueue(new Callback<Post>() {
                    @Override
                    public void onResponse(Call<Post> call, Response<Post> response) {
                            if(response.body() != null){
    
                                // Toast.makeText(ACTIVITY.this, "Success!!!", Toast.LENGTH_SHORT).show();
                            }
                        }
    
                        @Override
                        public void onFailure(Call<Post> call, Throwable t) {
                            // Toast.makeText(ACTIVITY.this, "Error Occured", Toast.LENGTH_SHORT).show();
    
                        }
    
                    });
                }
    
    }
    

    像这样更改您的 php 文件。现在它应该插入到您的数据库中

    //your database configuration
    
    $con = mysqli_connect(DB_SERVER,DB_USER,DB_PASSWORD,DB_DATABASE);
    
    
    $login = $_POST["loginStr"];
    $id_urz = $_POST["id_urzadzenia"];
    $dl_geo = $_POST["longitude"];
    $sz_geo = $_POST["latitude"];
    // echo "Login użytkownika: " .$login . "\n";
    // echo "ID urządzenia: " . $id_urz . "\n";
    // echo "Szerokość geograficzna: " . $sz_geo . "\n";
    // echo "Długość geograficzna: " . $dl_geo . "\n";
    date_default_timezone_get(Europe);
    $godz =  date("H:i:s");
    $sql = "INSERT INTO bartek (id_urzadzenia,szerokosc,dlugosc,data) VALUES ('$id_urz','$sz_geo','$dl_geo','$godz')";
    
    mysqli_query($con, $sql);
    mysqli_close($con);
    ?>
    

    【讨论】:

    • 因此,服务器获取 POST 请求,并通过回显返回结果,但应用程序显示“java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2”。这是服务器的答案:imgur.com/a/KoRI4P3
    • 虽然网站上没有显示这些值...仅在 Android Studio 中。
    • 这可能与我的 php 文件有关,我只是使用类似 "$value = $_POST["value"]; 的东西;不知道我是否做得对。
    • 您的响应是字符串,将其更改为对象。你能分享一下你是如何从 php 回复的吗?
    • 在您的 php 文件顶部写入 header('Content-Type: application/json'); 并使用 echo json_encode($data); 其中 data 是您的响应对象。
    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多