volley studio library android okhttp

android - studio - retrofit



Cómo agregar parámetros a la API(http post) usando la biblioteca okhttp en Android (6)

Ninguna de las respuestas funcionó para mí, así que jugué alrededor y debajo de una funcionó bien. Compartir solo en caso de que alguien se quede con el mismo problema:

Importaciones:

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;

Código:

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(); }

En mi aplicación de Android, estoy usando la biblioteca okHttp . ¿Cómo puedo enviar parámetros al servidor (api) usando la biblioteca okhttp? Actualmente estoy usando el siguiente código para acceder al servidor y ahora necesito usar la biblioteca okhttp.

este es mi código:

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());


Otra forma (sin MimeCraft) es hacer:

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

y declara:

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


Para OkHttp 3.x, se eliminó FormEncodingBuilder, use FormBody.Builder en su lugar

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();


Por lo general, para evitar Excepciones provocadas por el código que se ejecuta en el subproceso de interfaz de usuario, ejecute el proceso de solicitud y respuesta en un subproceso de trabajo (tarea Subproceso o Asincronización) según la duración anticipada del proceso.

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()); } }

Espero que ayude a alguien allí.


Solo necesita formatear el cuerpo del POST antes de crear el objeto RequestBody .

Puede hacerlo manualmente, pero le sugiero que use la biblioteca MimeCraft de Square (creadores de OkHttp).

En este caso necesitaría la clase FormEncoding.Builder ; establezca contentType en "application/x-www-form-urlencoded" y use add(name, value) para cada par clave-valor.


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()); }