Подтвердить что ты не робот

Как добавить параметры в api (http post) с использованием библиотеки okhttp в Android

В моем приложении для Android я использую okHttp. Как отправить параметры на сервер (api) с помощью библиотеки okhttp? в настоящее время я использую следующий код для доступа к серверу, теперь нужно использовать библиотеку okhttp.

это мой код:

httpPost = new HttpPost("http://xxx.xxx.xxx.xx/user/login.json");
nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("email".trim(), emailID));
nameValuePairs.add(new BasicNameValuePair("password".trim(), passWord));
httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
String response = new DefaultHttpClient().execute(httpPost, new BasicResponseHandler());
4b9b3361

Ответ 1

Для OkHttp 3.x, FormEncodingBuilder был удален, вместо этого используйте FormBody.Builder

        RequestBody formBody = new FormBody.Builder()
                .add("email", "[email protected]")
                .add("tel", "90301171XX")
                .build();

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .post(formBody)
                .build();

        Response response = client.newCall(request).execute();
        return response.body().string();

Ответ 2

    private final OkHttpClient client = new OkHttpClient();

      public void run() throws Exception {
        RequestBody formBody = new FormEncodingBuilder()
            .add("email", "[email protected]")
            .add("tel", "90301171XX")
            .build();
        Request request = new Request.Builder()
            .url("https://en.wikipedia.org/w/index.php")
            .post(formBody)
            .build();

        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

        System.out.println(response.body().string());
      }

Ответ 3

Вам просто нужно отформатировать тело POST перед созданием объекта RequestBody.

Вы можете сделать это вручную, но я предлагаю вам использовать библиотеку MimeCraft на Square (создатели OkHttp).

В этом случае вам понадобится класс FormEncoding.Builder; установите для параметра contentType значение "application/x-www-form-urlencoded" и используйте add(name, value) для каждой пары значений ключа.

Ответ 4

Ни один из ответов не работал у меня, поэтому я играл вокруг и под одним работал хорошо. Совместное использование на случай, если кто-то застрянет с той же проблемой:

Импорт

import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;

код:

OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new MultipartBuilder()
        .type(MultipartBuilder.FORM) //this is what I say in my POSTman (Chrome plugin)
        .addFormDataPart("name", "test")
        .addFormDataPart("quality", "240p")
        .build();
Request request = new Request.Builder()
        .url(myUrl)
        .post(requestBody)
        .build();
try {
    Response response = client.newCall(request).execute();
    String responseString = response.body().string();
    response.body().close();
    // do whatever you need to do with responseString
}
catch (Exception e) {
    e.printStackTrace();
}

Ответ 5

Другой способ (без MimeCraft):

    parameters = "param1=text&param2=" + param2  // for example !
    request = new Request.Builder()
            .url(url + path)
            .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, parameters))
            .build();

и объявите:

    public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");

Ответ 6

Обычно, чтобы избежать исключений, вызванных кодом, запущенным в потоке пользовательского интерфейса, запустите процесс запроса и ответа в рабочем потоке (задача Thread или Asynch) в зависимости от ожидаемой длины процесса.

    private void runInBackround(){

       new Thread(new Runnable() {
            @Override
            public void run() { 
                //method containing process logic.
                makeNetworkRequest(reqUrl);
            }
        }).start();
    }

    private void makeNetworkRequest(String reqUrl) {
       Log.d(TAG, "Booking started: ");
       OkHttpClient httpClient = new OkHttpClient();
       String responseString = "";

       Calendar c = Calendar.getInstance();
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       String booked_at = sdf.format(c.getTime());

         try{
             RequestBody body = new FormBody.Builder()
                .add("place_id", id)
                .add("booked_at", booked_at)
                .add("booked_by", user_name.getText().toString())
                .add("booked_from", lat+"::"+lng)
                .add("phone_number", user_phone.getText().toString())
                .build();

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

        Response response = httpClient
                .newCall(request)
                .execute();
        responseString =  response.body().string();
        response.body().close();
        Log.d(TAG, "Booking done: " + responseString);

        // Response node is JSON Object
        JSONObject booked = new JSONObject(responseString);
        final String okNo = booked.getJSONArray("added").getJSONObject(0).getString("response");
        Log.d(TAG, "Booking made response: " + okNo);

        runOnUiThread(new Runnable()
        {
            public void run()
            {
                if("OK" == okNo){
                    //display in short period of time
                    Toast.makeText(getApplicationContext(), "Booking Successful", Toast.LENGTH_LONG).show();
                }else{
                    //display in short period of time
                    Toast.makeText(getApplicationContext(), "Booking Not Successful", Toast.LENGTH_LONG).show();
                }
            }
        });

    } catch (MalformedURLException e) {
        Log.e(TAG, "MalformedURLException: " + e.getMessage());
    } catch (ProtocolException e) {
        Log.e(TAG, "ProtocolException: " + e.getMessage());
    } catch (IOException e) {
        Log.e(TAG, "IOException: " + e.getMessage());
    } catch (Exception e) {
        Log.e(TAG, "Exception: " + e.getMessage());
    }

}

Я надеюсь, что это кому-то поможет.

Ответ 7

Если вы хотите отправить данные Post через API с использованием OKHTTP 3, попробуйте ниже простой код

MediaType MEDIA_TYPE = MediaType.parse("application/json");
        String url = "https://cakeapi.trinitytuts.com/api/add";

        OkHttpClient client = new OkHttpClient();

        JSONObject postdata = new JSONObject();
        try {
            postdata.put("username", "name");
            postdata.put("password", "12345");
        } catch(JSONException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

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

        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .header("Accept", "application/json")
                .header("Content-Type", "application/json")
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                String mMessage = e.getMessage().toString();
                Log.w("failure Response", mMessage);
                //call.cancel();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                String mMessage = response.body().string();
                Log.e(TAG, mMessage);
            }
        });

Вы можете прочитать полное руководство по отправке данных на сервер, используя GET и POST-запрос OKHTTP 3, здесь: - https://trinitytuts.com/get-and-post-request-using-okhttp-in-android-application/