Dans ma Android, j'utilise la bibliothèque okHttp . Comment envoyer des paramètres au serveur (api) en utilisant la bibliothèque okhttp? Actuellement j'utilise le code suivant pour accéder au serveur, vous devez maintenant utiliser la bibliothèque okhttp.
c'est le mon code:
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());
Pour OkHttp 3.x, FormEncodingBuilder a été supprimé, utilisez plutôt 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();
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());
}
Il vous suffit de formater le corps de POST avant de créer l'objet RequestBody
.
Vous pouvez le faire manuellement, mais je vous suggère d'utiliser la bibliothèque MimeCraft de Square (fabricants d'OkHttp).
Dans ce cas, vous auriez besoin de la classe FormEncoding.Builder
; définissez contentType
sur "application/x-www-form-urlencoded"
et utilisez add(name, value)
pour chaque paire clé-valeur.
Aucune des réponses n'a fonctionné pour moi, donc j'ai joué autour et en dessous une a bien fonctionné. Partager juste au cas où quelqu'un se retrouverait avec le même problème:
Importations:
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;
Code:
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();
}
Habituellement, pour éviter les exceptions provoquées par le code exécuté dans le thread d'interface utilisateur, exécutez le processus de demande et de réponse dans un thread de travail (tâche Thread ou Asynch) en fonction de la durée prévue du processus.
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());
}
}
J'espère que cela aide quelqu'un là-bas.
Une autre façon (sans MimeCraft), est de faire:
parameters = "param1=text¶m2=" + param2 // for example !
request = new Request.Builder()
.url(url + path)
.post(RequestBody.create(MEDIA_TYPE_MARKDOWN, parameters))
.build();
et déclarer:
public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
Si vous souhaitez envoyer des données de publication via l'API en utilisant OKHTTP 3, veuillez essayer ci-dessous le code simple
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);
}
});
Vous pouvez lire le tutoriel complet pour envoyer des données au serveur en utilisant OKHTTP 3 GET et POST demande ici: - https://trinitytuts.com/get-and-post-request- using-okhttp-in-Android-application /