【问题标题】:How to make a simple http post request in Android?如何在 Android 中发出简单的 http post 请求?
【发布时间】:2020-02-15 08:24:28
【问题描述】:

我是安卓初学者。我确实有一些java经验,但有一段时间无法解决这个问题。

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

我已经用注释突出显示了函数的一部分。我不明白的部分是重写方法。正如我所说,我是一个初学者,Android Studio 让我包含这些方法(OnResponse,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) {

            }
        });
    }

【问题讨论】:

    标签: java android


    【解决方案1】:

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

    如果您需要调用线程中的结果并阻塞直到结果可用,您可以使用调用类的execute() 方法。请注意,这不适用于 Android 的主线程,因为那里不允许网络访问。

    【讨论】:

    • 我认为这是我的确切问题。我已经在主线程中选择了图像,所以我在主线程中尝试了 execute(),但正如你所说的那样有一个异常。我该如何解决?我对线程概念不熟悉...
    • 这个问题很难给出一个好的答案,因为我不知道你的代码库。一种简单的方法是启动某种形式的加载指示器,然后调用 enqueue 函数,当调用 onResponseonFailure 函数时,您将停止加载指示器并处理/显示结果。
    【解决方案2】:

    Retrofit 2: Get JSON from Response body

    如果你想发帖,请通过上面的链接,然后只需将参数传递给接口,就像上面提到的那样

    在api接口写

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

    并使用

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

    而不是

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

    并根据您的 json 响应使用模型类,如果有任何查询,请删除评论

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      相关资源
      最近更新 更多