Java 如何在Android中发出简单的http post请求?

Java 如何在Android中发出简单的http post请求?,java,android,Java,Android,我是android的初学者。我确实有一些java方面的经验,但在一段时间内无法解决这个问题 以下是一些背景信息: 我正在尝试制作一个移动应用程序,它从图库或相机中拾取图像,然后将其发送到我的服务器。我已经完成了挑选图像,将其转换为base64,但不知何故,我无法完成http post请求的功能。我希望此函数从服务器返回响应,但我失败了 我用注释突出显示了函数的一部分。我不理解的部分是重写的方法。正如我所说,我是一个初学者,Android Studio让我将这些方法包括在response、OnFa

我是android的初学者。我确实有一些java方面的经验,但在一段时间内无法解决这个问题

以下是一些背景信息: 我正在尝试制作一个移动应用程序,它从图库或相机中拾取图像,然后将其发送到我的服务器。我已经完成了挑选图像,将其转换为base64,但不知何故,我无法完成http post请求的功能。我希望此函数从服务器返回响应,但我失败了

我用注释突出显示了函数的一部分。我不理解的部分是重写的方法。正如我所说,我是一个初学者,Android Studio让我将这些方法包括在response、OnFailure中,使用这些方法我无法返回响应,因为它们是无效的;没有这些方法,我就有一个例外,我不知道它是从哪里来的

public void postRequest(String postdata) throws IOException {
        MediaType MEDIA_TYPE = MediaType.parse("application/json");
        String url = "https://ptsv2.com/t/z497u-xxx/post";

        OkHttpClient client = new OkHttpClient();

        RequestBody body = RequestBody.create(MEDIA_TYPE, postdata);

        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();

        //THIS IS THE PART I DO NOT UNDERSTAND
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                message = response.body().string();
            }
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }
        });
    }
enqueue函数在后台线程上执行网络访问。因此,您无法立即获得结果。要接收结果,必须传入回调实例。当请求在另一个线程中完成时,OkHttp将调用回调实例的onResponse函数。如果请求失败,它将调用onFailure

如果在调用线程和块中需要结果,直到结果可用为止,可以使用调用类的execute方法。请注意,这在Android的主线程上不起作用,因为那里不允许网络访问

若您想发布,请通过上面的链接,然后只需将参数传递到如下所述的接口

在api接口中写入

@FormUrlEncoded
@POST("append_url")
Call<CompanyDetailsResponse> getCompanyDetails(@Field("para") String para);
和使用

Call<CompanyDetailsResponse> call = apiService.getCompanyDetails("para");
而不是

Call<CompanyDetailsResponse> call = apiService.getCompanyDetails();

并根据您的json响应使用模型类,如果有任何查询,请删除注释,我认为这正是我的问题所在。我在主线程中选择了图像,所以我尝试在主线程中执行,但正如您所说的,出现了一个异常。我怎样才能解决它?我不熟悉线程的概念…很难给这个问题一个好的答案,因为我不知道你的代码库。一种简单的方法是启动某种形式的加载指示器,然后调用排队函数,当调用onResponse或onFailure函数时,您将停止加载指示器并处理/显示结果。