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 stream d’entrée pour l’écriture de contenu et ne sait pas (ou se soucie) du format de ce contenu.
Maintenant, je veux faire un post normal à l’URL avec des parameters de nom et de mot de passe.
Cela signifie que je dois encoder moi-même le nom et la paire de valeurs en stream.
La réponse acceptée actuelle est obsolète. Maintenant, si vous souhaitez créer une demande de publication et y append des parameters, vous devriez utiliser MultipartBody.Builder comme Mime Craft est maintenant 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();
Selon les docs , OkHttp version 3 a remplacé FormEncodingBuilder
avec FormBody
et FormBody.Builder()
, donc les anciens exemples ne fonctionneront plus.
Les corps de formulaire et multipart sont maintenant modélisés. Nous avons remplacé le
FormEncodingBuilder
opaque par le comboFormBody
etFormBody.Builder
plus puissant.De même, nous avons mis à niveau
MultipartBuilder
dansMultipartBody
,MultipartBody.Part
etMultipartBody.Builder
.
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(); }
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().ssortingng()); }
Vous devez l’encoder vous-même en échappant les 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();
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().ssortingng(); Log.e("response ", "onResponse(): " + response ); } });
C’est l’une des solutions possibles pour implémenter une post-requête 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());
Vous devriez vérifier les tutoriels sur lynda.com . Voici un exemple de la façon d’encoder les parameters, de faire une requête HTTP et ensuite d’parsingr la réponse à un object json.
public JSONObject getJSONFromUrl(Ssortingng str_url, List params) { Ssortingng 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(); SsortingngBuilder sb = new SsortingngBuilder(); reader = new BufferedReader(new InputStreamReader(con.getInputStream())); Ssortingng line; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } reply_str = sb.toSsortingng(); } catch (Exception e) { e.printStackTrace(); return null; } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); return null; } } } // try parse the ssortingng 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.toSsortingng()); } return jObj; } //in this case it's NameValuePair, but you can use any container public Ssortingng getEncodedParams(List params) { SsortingngBuilder sb = new SsortingngBuilder(); for (NameValuePair nvp : params) { Ssortingng key = nvp.getName(); Ssortingng param_value = nvp.getValue(); Ssortingng 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.toSsortingng(); }
Voici ma méthode pour faire post-requête première passe dans la carte de méthode et les données comme
HashMap param = new HashMap(); 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 data, Ssortingng url) { try { RequestBody requestBody; MultipartBuilder mBuilder = new MultipartBuilder().type(MultipartBuilder.FORM); if (data != null) { for (Ssortingng key : data.keySet()) { Ssortingng 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(); Ssortingng responseBody = response.body().ssortingng(); 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; }
protected Void doInBackground(Ssortingng... 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; }
Pour append okhttp comme une dépendance, procédez comme suit
maintenant tu as okhttp comme dépendance
Concevez maintenant 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(Ssortingng res); }
Je crée une classe nommée NetworkTask afin que je puisse utiliser cette classe pour gérer toutes les requêtes réseau
public class NetworkTask extends AsyncTask{ public NetworkCallback instance; public Ssortingng url ; public Ssortingng 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, Ssortingng url, Ssortingng json, int task){ this.instance = ins; this.url = url; this.json = json; this.task = task; } public Ssortingng doGetRequest() throws IOException { Request request = new Request.Builder() .url(url) .build(); Response response = client.newCall(request).execute(); return response.body().ssortingng(); } public Ssortingng 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().ssortingng(); } @Override protected Ssortingng doInBackground(Ssortingng[] params) { try { Ssortingng 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(Ssortingng s) { super.onPostExecute(s); instance.getResponse(s); } }
laissez-moi maintenant montrer comment obtenir le rappel à une activité
public class MainActivity extends AppCompatActivity implements NetworkCallback{ Ssortingng postUrl = "http://your-post-url-goes-here"; Ssortingng 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.toSsortingng(), 2); t.execute(postUrl); } public void sendGetRq(){ // 1 because get rq is for the case 1 NetworkTask t = new NetworkTask(this, getUrl, jo.toSsortingng(), 1); t.execute(getUrl); } @Override public void getResponse(Ssortingng res) { // here is the response from NetworkTask class System.out.println(res) } }
comstack 'com.squareup.okhttp3:okhttp:3.7.0'
OkHttpClient client = new OkHttpClient(); MediaType MIMEType= MediaType.parse("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create (MIMEType,"{}"); Request request = new Request.Builder().url(url).post(requestBody).build(); Response response = client.newCall(request).execute();
public static JSONObject doPostRequestWithSingleFile(Ssortingng url,HashMap data, File file,Ssortingng fileParam) { try { final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); RequestBody requestBody; MultipartBuilder mBuilder = new MultipartBuilder().type(MultipartBuilder.FORM); for (Ssortingng key : data.keySet()) { Ssortingng 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(); Ssortingng result=response.body().ssortingng(); 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 param,Ssortingng url) { JSONObject result = null; Ssortingng response; Set keys = param.keySet(); int count = 0; for (Iterator i = keys.iterator(); i.hasNext(); ) { count++; Ssortingng key = (Ssortingng) i.next(); Ssortingng value = (Ssortingng) 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().ssortingng(); 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; }