RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 625649
Accepted
tCode
tCode
Asked:2020-02-09 20:43:11 +0000 UTC2020-02-09 20:43:11 +0000 UTC 2020-02-09 20:43:11 +0000 UTC

Android 中的 POST 请求。如何?

  • 772

决定在Android下尿尿试试,于是出现了非常多的问题。谁不难回答请。

我正在尝试使应用程序使用特定的 API,使用 进行通信json,但我无法编写一个类,例如在 sharp 上,我向其传递地址、参数并执行POST请求,例如,像这里https://stackoverflow.com/questions/4015324/http-request-with-post。

据我了解,Android应用程序无法执行POST来自常规方法的请求,您需要使用它AsyncTask<>-我什么都不懂,从语法本身开始,即调用类型方法时是否枚举doInBackground(String... params)参数或者是什么? 总而言之String...doInBackground(str1, str2, str3)

我不是要你为我写现成的代码,我是要你帮助我理解如何POST在 Android 中处理请求的原理,至少一个具体的例子:POST (json)以相同的方式发送和接收响应json以及一点理论,请))。

java
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. Best Answer
    temq
    2020-02-10T05:02:05Z2020-02-10T05:02:05Z

    AsyncTask最好尝试一次,然后忘记它们。也一样HttpUrlConnection。目前,Retorofti被认为是与 Android 中的 Rest 服务器交互的主要库。官网上有例子。第三方资源上也有不少,例如这里。我只会给出一个示例POST请求。

    为此,我们需要一个从服务器接收到的 Json 转换成的模型类,一个请求主体的模型类,以及一个带有特殊注解方法的接口。

    假设服务器有一个向用户添加邮政地址的方法,并返回一些有关操作状态的信息。在请求正文中,服务器接受常规字符串数组,并将结果作为 Json 返回。

    首先,我们创建一个服务器响应模型(声明为字段是public为了减少代码,在实际应用中最好使用private+get/set方法):

    public class AddEmailResult {
        @SerializedName("email")
        public String email;
        @SerializedName("primary")
        public Boolean primary;
        @SerializedName("verified")
        public Boolean verified;
    }
    

    现在我们创建一个接口,通过它与服务器进行交互。

    public interface Server {
        @POST("user/addemail") 
        Call<List<AddEmailResult>> addEmail(@Body List<String> emails)
    }
    

    方法上面的注解表示POST请求将被执行,注解@Body表明这个对象应该在请求体中传递。

    接下来,您需要创建一个服务器。它是这样完成的:

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com") // Адрес сервера
        .addConverterFactory(GsonConverterFactory.create()) // говорим ретрофиту что для сериализации необходимо использовать GSON
        .build();
    
    Server service = retrofit.create(Server.class);
    Call<List<AddEmailResult>> call = service.addEmail(/*list of string*/)
    call.enqueue(new Callback<List<AddEmailResult>>() {  
        @Override
        public void onResponse(Call<List<AddEmailResult>> call, Response<List<AddEmailResult>> response) {
            if (response.isSuccessful()) {
                // запрос выполнился успешно, сервер вернул Status 200
            } else {
                // сервер вернул ошибку
            }
        }
    
        @Override
        public void onFailure(Call<List<AddEmailResult>> call, Throwable t) {
            // ошибка во время выполнения запроса
        }
    });
    

    通过调用该方法,enqueue()您告诉请求异步执行。最后,结果会传到传递过来的回调中进行处理。基本上就是这样。这个库不仅限于一个POST请求,它可以完成开发客户端-服务器应用程序所需的一切。

    要为您的项目添加改造,您需要build.gradle添加以下内容:

    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.google.code.gson:gson:2.6.1'
    
    • 8
  2. Кирилл Малышев
    2020-02-09T21:15:58Z2020-02-09T21:15:58Z

    这是另一个带有现成活动的示例,该活动将简单的 json 发送到服务器。从我的回答中复制:

    public class MainActivity extends Activity {
    
    ProgressDialog dialog;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        new RequestTask().execute("http://www.site.ru/login.php"); // скрипт, на который посылаем запрос
    }
    
    public String getJSON(String login, String pass) // получаем json объект в виде строки
    {
        JSONObject bot = new JSONObject();
        try {
            bot.put("Login", login);
            bot.put("Password", pass);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return bot.toString();
    }
    
    public class RequestTask extends AsyncTask<String, String, String> {
    
        @Override
        protected String doInBackground(String... params) {
    
            try {
                DefaultHttpClient hc = new DefaultHttpClient();
                ResponseHandler<String> res = new BasicResponseHandler();
                HttpPost postMethod = new HttpPost(params[0]);
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                // ключ - "json", параметр - json в виде строки
                nameValuePairs.add(new BasicNameValuePair("json", getJSON("userlogin", "userpass")));
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePairs, "UTF-8");
                postMethod.setEntity(entity);
                return hc.execute(postMethod, res);
            } catch (Exception e) {
                System.out.println("Exp=" + e);
            }
            return null;
        }
    
        @Override
        protected void onPostExecute(String res) {
    
            dialog.dismiss();
    
            // res - ответ сервера
    
            super.onPostExecute(res);
        }
    
        @Override
        protected void onPreExecute() {
            dialog = new ProgressDialog(MainActivity.this);
            dialog.setMessage("Ожидание");
            dialog.setIndeterminate(true);
            dialog.setCancelable(false);
            dialog.show();
            super.onPreExecute();
        }
    }
    }
    

    例如,您可以在 PHP 中处理请求:

    <?php
    $json = $_POST['json']; // получаем json объект
    $array = json_decode($json, true); // преобразуем его в ассоциативный массив
    // получаем из него данные
    $login = $array['Login'];
    $pass = $array['Password'];
    // дальше уже делаем то, что нужно
    file_put_contents('login.txt', "$login\n$pass");
    ?>
    
    • 2
  3. Андрей Таранов
    2020-09-05T23:18:29Z2020-09-05T23:18:29Z

    AsyncTask 最好尝试一次,然后忘记它们。HttpUrlConnection 也是如此。目前,Retorofti 被认为是与 Android 中的 Rest 服务器交互的主要库。

    恕我直言,Retrofit 是一个沉重但不是最好的文档库,专注于使用自己的 API 与 Web 门户一起工作。至少,网络上的所有示例都说明了如何使用它们。如果您需要通过 http 传输 10 个字符的字符串,而无需稍后创建一堆不必要的代码,HttpUrlConnection + AsyncTask 就可以了。

    • 2
  4. Aksenov Vladimir
    2020-02-09T20:54:19Z2020-02-09T20:54:19Z

    下面是一个发送请求的简单示例。params 只是一个无限的字符串数组。HttpPost 采用一个字符串,它是服务器上脚本的地址。
    BasicNameValuePair 只是您要发送的内容的键值列表。响应是服务器脚本给我们的。没有必要在 AsyncTask 中执行此操作。但通常他们会这样做。由于这不是即时操作,最好在新线程中处理它。如果您需要具体澄清某些内容,请写在评论中。我会回答

    String doInBackground(String... params) throws IOException {
                DefaultHttpClient hc = new DefaultHttpClient();
                ResponseHandler<String> res = new BasicResponseHandler();
                HttpPost postMethod = new HttpPost(params[0]);
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
                //nameValuePairs.add(new BasicNameValuePair("ID_group", PageViewActivity.Get_list_group.get(PageViewActivity.Cur_group_position).get(0)));
                nameValuePairs.add(new BasicNameValuePair("ID_group", group_id));
                nameValuePairs.add(new BasicNameValuePair("Login", Login));
                nameValuePairs.add(new BasicNameValuePair("Password", Password));
                postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                String response = hc.execute(postMethod, res);
                System.out.println(response);
                return response;
            }
    

    现在关于 json 解析。响应 - 带有 json 的字符串

                JSONObject jsonResponse = new JSONObject(response);
                JSONArray movies = jsonResponse.getJSONArray("Resourse");
                for (int i = 0; i < movies.length(); i++) {
                    JSONObject actor = null;
                    actor = movies.getJSONObject(i);
                    String Text = null;
                    Text = actor.getString("ID");
                    News_list.add(text);
               }
    

    可以在此处看到我们正在解析的 json 本身的示例。纯粹为了理解格式http://contester.ddns.is74.ru:84/Get_all_group_list.ashx

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5