J'ai lu quelques exemples qui publient des jsons sur le serveur.
quelqu'un dit:
OkHttp est une implémentation de l'interface HttpUrlConnection fournie par Java. Il fournit un flux d'entrée pour écrire du contenu et ne sait pas (ou ne se soucie pas) du format de ce contenu.
Maintenant, je veux faire un message normal à l'URL avec des paramètres de nom et de mot de passe.
Cela signifie que je dois encoder la paire nom et valeur dans le flux par moi-même?
Réponses:
La réponse actuellement acceptée est obsolète. Maintenant, si vous souhaitez créer une demande de publication et y ajouter des paramètres, vous devez utiliser MultipartBody.Builder car Mime Craft est désormais obsolète .
RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("somParam", "someValue") .build(); Request request = new Request.Builder() .url(BASE_URL + route) .post(requestBody) .build();
la source
int
enString
@AqibBangash.addHeader("Content-Type", " application/x-www-form-urlencoded")
Selon la documentation , OkHttp version 3 a été remplacé
FormEncodingBuilder
parFormBody
etFormBody.Builder()
, donc les anciens exemples ne fonctionneront plus.Donc, si vous utilisez OkHttp 3.x, essayez l'exemple suivant:
OkHttpClient client = new OkHttpClient(); RequestBody formBody = new FormBody.Builder() .add("message", "Your message") .build(); Request request = new Request.Builder() .url("http://www.foo.bar/index.php") .post(formBody) .build(); try { Response response = client.newCall(request).execute(); // Do something with the response. } catch (IOException e) { e.printStackTrace(); }
la source
AsyncTask
, ouIntentService
, ou n'importe où sauf dans le fil de discussion principal :).add("message", "Your message")
dans l'add
appel de méthode quel est l'argument à deux chaînes? Je veux transmettre uniquement un contenu de chaîne de corps . Comment?private final OkHttpClient client = new OkHttpClient(); public void run() throws Exception { RequestBody formBody = new FormEncodingBuilder() .add("search", "Jurassic Park") .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()); }
la source
Vous devez l'encoder vous-même en échappant des chaînes avec URLEncoder et en les joignant avec
"="
et"&"
. Ou vous pouvez utiliser FormEncoder de Mimecraft qui vous donne un constructeur pratique.FormEncoding fe = new FormEncoding.Builder() .add("name", "Lorem Ipsum") .add("occupation", "Filler Text") .build();
la source
HttpUrl
classe (à partir de la bibliothèque OkHttp).Vous pouvez le faire comme ceci:
MediaType JSON = MediaType.parse("application/json; charset=utf-8"); RequestBody body = RequestBody.create(JSON, "{"jsonExample":"value"}"); OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .post(body) .addHeader("Authorization", "header value") //Notice this request has header if you don't need to send a header just erase this part .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { Log.e("HttpService", "onFailure() Request was: " + request); e.printStackTrace(); } @Override public void onResponse(Response r) throws IOException { response = r.body().string(); Log.e("response ", "onResponse(): " + response ); } });
la source
Pour ajouter okhttp en tant que dépendance, procédez comme suit
maintenant vous avez okhttp comme dépendance
Maintenant, concevez une interface comme ci-dessous afin que nous puissions avoir le rappel de notre activité une fois la réponse du réseau reçue.
public interface NetworkCallback { public void getResponse(String res); }
Je crée une classe nommée NetworkTask afin de pouvoir utiliser cette classe pour gérer toutes les requêtes réseau
public class NetworkTask extends AsyncTask<String , String, String>{ public NetworkCallback instance; public String url ; public String json; public int task ; OkHttpClient client = new OkHttpClient(); public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); public NetworkTask(){ } public NetworkTask(NetworkCallback ins, String url, String json, int task){ this.instance = ins; this.url = url; this.json = json; this.task = task; } public String doGetRequest() throws IOException { Request request = new Request.Builder() .url(url) .build(); Response response = client.newCall(request).execute(); return response.body().string(); } public String doPostRequest() throws IOException { RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(url) .post(body) .build(); Response response = client.newCall(request).execute(); return response.body().string(); } @Override protected String doInBackground(String[] params) { try { String response = ""; switch(task){ case 1 : response = doGetRequest(); break; case 2: response = doPostRequest(); break; } return response; }catch (Exception e){ e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); instance.getResponse(s); } }
maintenant, laissez-moi vous montrer comment obtenir le rappel d'une activité
public class MainActivity extends AppCompatActivity implements NetworkCallback{ String postUrl = "http://your-post-url-goes-here"; String getUrl = "http://your-get-url-goes-here"; Button doGetRq; Button doPostRq; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.button); doGetRq = findViewById(R.id.button2); doPostRq = findViewById(R.id.button1); doPostRq.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MainActivity.this.sendPostRq(); } }); doGetRq.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MainActivity.this.sendGetRq(); } }); } public void sendPostRq(){ JSONObject jo = new JSONObject(); try { jo.put("email", "yourmail"); jo.put("password","password"); } catch (JSONException e) { e.printStackTrace(); } // 2 because post rq is for the case 2 NetworkTask t = new NetworkTask(this, postUrl, jo.toString(), 2); t.execute(postUrl); } public void sendGetRq(){ // 1 because get rq is for the case 1 NetworkTask t = new NetworkTask(this, getUrl, jo.toString(), 1); t.execute(getUrl); } @Override public void getResponse(String res) { // here is the response from NetworkTask class System.out.println(res) } }
la source
Requête OkHttp
POST
avec jeton dans l'en-têteRequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("search", "a") .addFormDataPart("model", "1") .addFormDataPart("in", "1") .addFormDataPart("id", "1") .build(); OkHttpClient client = new OkHttpClient(); okhttp3.Request request = new okhttp3.Request.Builder() .url("https://somedomain.com/api") .post(requestBody) .addHeader("token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIkMnkkMTAkZzZrLkwySlFCZlBmN1RTb3g3bmNpTzltcVwvemRVN2JtVC42SXN0SFZtbzZHNlFNSkZRWWRlIiwic3ViIjo0NSwiaWF0IjoxNTUwODk4NDc0LCJleHAiOjE1NTM0OTA0NzR9.tefIaPzefLftE7q0yKI8O87XXATwowEUk_XkAOOQzfw") .addHeader("cache-control", "no-cache") .addHeader("Postman-Token", "7e231ef9-5236-40d1-a28f-e5986f936877") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, okhttp3.Response response) throws IOException { if (response.isSuccessful()) { final String myResponse = response.body().string(); MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { Log.d("response", myResponse); progress.hide(); } }); } } });
la source
C'est l'une des solutions possibles pour implémenter une requête de publication OKHTTP sans corps de requête.
RequestBody reqbody = RequestBody.create(null, new byte[0]); Request.Builder formBody = new Request.Builder().url(url).method("POST",reqbody).header("Content-Length", "0"); clientOk.newCall(formBody.build()).enqueue(OkHttpCallBack());
la source
Vous devriez consulter les tutoriels sur lynda.com . Voici un exemple de la façon d'encoder les paramètres, de faire une requête HTTP, puis d'analyser la réponse à l'objet json.
public JSONObject getJSONFromUrl(String str_url, List<NameValuePair> params) { String reply_str = null; BufferedReader reader = null; try { URL url = new URL(str_url); OkHttpClient client = new OkHttpClient(); HttpURLConnection con = client.open(url); con.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream()); writer.write(getEncodedParams(params)); writer.flush(); StringBuilder sb = new StringBuilder(); reader = new BufferedReader(new InputStreamReader(con.getInputStream())); String line; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } reply_str = sb.toString(); } catch (Exception e) { e.printStackTrace(); return null; } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); return null; } } } // try parse the string to a JSON object. There are better ways to parse data. try { jObj = new JSONObject(reply_str); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } return jObj; } //in this case it's NameValuePair, but you can use any container public String getEncodedParams(List<NameValuePair> params) { StringBuilder sb = new StringBuilder(); for (NameValuePair nvp : params) { String key = nvp.getName(); String param_value = nvp.getValue(); String value = null; try { value = URLEncoder.encode(param_value, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (sb.length() > 0) { sb.append("&"); } sb.append(key + "=" + value); } return sb.toString(); }
la source
protected Void doInBackground(String... movieIds) { for (; count <= 1; count++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } Resources res = getResources(); String web_link = res.getString(R.string.website); OkHttpClient client = new OkHttpClient(); RequestBody formBody = new FormBody.Builder() .add("name", name) .add("bsname", bsname) .add("email", email) .add("phone", phone) .add("whatsapp", wapp) .add("location", location) .add("country", country) .add("state", state) .add("city", city) .add("zip", zip) .add("fb", fb) .add("tw", tw) .add("in", in) .add("age", age) .add("gender", gender) .add("image", encodeimg) .add("uid", user_id) .build(); Request request = new Request.Builder() .url(web_link+"edit_profile.php") .post(formBody) .build(); try { Response response = client.newCall(request).execute(); JSONArray array = new JSONArray(response.body().string()); JSONObject object = array.getJSONObject(0); hashMap.put("msg",object.getString("msgtype")); hashMap.put("msg",object.getString("msg")); // Do something with the response. } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return null; }
la source
Voici ma méthode pour faire une demande de publication en premier dans la carte de méthode et des données telles que
HashMap<String, String> param = new HashMap<String, String>(); param.put("Name", name); param.put("Email", email); param.put("Password", password); param.put("Img_Name", ""); final JSONObject result = doPostRequest(map,Url); public static JSONObject doPostRequest(HashMap<String, String> data, String url) { try { RequestBody requestBody; MultipartBuilder mBuilder = new MultipartBuilder().type(MultipartBuilder.FORM); if (data != null) { for (String key : data.keySet()) { String value = data.get(key); Utility.printLog("Key Values", key + "-----------------" + value); mBuilder.addFormDataPart(key, value); } } else { mBuilder.addFormDataPart("temp", "temp"); } requestBody = mBuilder.build(); Request request = new Request.Builder() .url(url) .post(requestBody) .build(); OkHttpClient client = new OkHttpClient(); Response response = client.newCall(request).execute(); String responseBody = response.body().string(); Utility.printLog("URL", url); Utility.printLog("Response", responseBody); return new JSONObject(responseBody); } catch (UnknownHostException | UnsupportedEncodingException e) { JSONObject jsonObject=new JSONObject(); try { jsonObject.put("status","false"); jsonObject.put("message",e.getLocalizedMessage()); } catch (JSONException e1) { e1.printStackTrace(); } Log.e(TAG, "Error: " + e.getLocalizedMessage()); } catch (Exception e) { e.printStackTrace(); JSONObject jsonObject=new JSONObject(); try { jsonObject.put("status","false"); jsonObject.put("message",e.getLocalizedMessage()); } catch (JSONException e1) { e1.printStackTrace(); } Log.e(TAG, "Other Error: " + e.getLocalizedMessage()); } return null; }
la source
la source
public static JSONObject doPostRequestWithSingleFile(String url,HashMap<String, String> data, File file,String fileParam) { try { final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); RequestBody requestBody; MultipartBuilder mBuilder = new MultipartBuilder().type(MultipartBuilder.FORM); for (String key : data.keySet()) { String value = data.get(key); Utility.printLog("Key Values", key + "-----------------" + value); mBuilder.addFormDataPart(key, value); } if(file!=null) { Log.e("File Name", file.getName() + "==========="); if (file.exists()) { mBuilder.addFormDataPart(fileParam, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file)); } } requestBody = mBuilder.build(); Request request = new Request.Builder() .url(url) .post(requestBody) .build(); OkHttpClient client = new OkHttpClient(); Response response = client.newCall(request).execute(); String result=response.body().string(); Utility.printLog("Response",result+""); return new JSONObject(result); } catch (UnknownHostException | UnsupportedEncodingException e) { Log.e(TAG, "Error: " + e.getLocalizedMessage()); JSONObject jsonObject=new JSONObject(); try { jsonObject.put("status","false"); jsonObject.put("message",e.getLocalizedMessage()); } catch (JSONException e1) { e1.printStackTrace(); } } catch (Exception e) { Log.e(TAG, "Other Error: " + e.getMessage()); JSONObject jsonObject=new JSONObject(); try { jsonObject.put("status","false"); jsonObject.put("message",e.getLocalizedMessage()); } catch (JSONException e1) { e1.printStackTrace(); } } return null; } public static JSONObject doGetRequest(HashMap<String, String> param,String url) { JSONObject result = null; String response; Set keys = param.keySet(); int count = 0; for (Iterator i = keys.iterator(); i.hasNext(); ) { count++; String key = (String) i.next(); String value = (String) param.get(key); if (count == param.size()) { Log.e("Key",key+""); Log.e("Value",value+""); url += key + "=" + URLEncoder.encode(value); } else { Log.e("Key",key+""); Log.e("Value",value+""); url += key + "=" + URLEncoder.encode(value) + "&"; } } /* try { url= URLEncoder.encode(url, "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }*/ Log.e("URL", url); OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .build(); Response responseClient = null; try { responseClient = client.newCall(request).execute(); response = responseClient.body().string(); result = new JSONObject(response); Log.e("response", response+"=============="); } catch (Exception e) { JSONObject jsonObject=new JSONObject(); try { jsonObject.put("status","false"); jsonObject.put("message",e.getLocalizedMessage()); return jsonObject; } catch (JSONException e1) { e1.printStackTrace(); } e.printStackTrace(); } return result; }
la source