Androidアプリケーションでは、 okHttp ライブラリを使用しています。okhttpライブラリを使用してパラメータをserver(api)に送信するにはどうすればよいですか?現在、次のコードを使用していますサーバーにアクセスするには、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());
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();
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());
}
RequestBody
オブジェクトを作成する前に、POST=の本体をフォーマットする必要があります。
これは手動で行うこともできますが、Square(OkHttpのメーカー)の MimeCraft ライブラリを使用することをお勧めします。
この場合、 _FormEncoding.Builder
_ クラスが必要です。 contentType
を_"application/x-www-form-urlencoded"
_に設定し、各キーと値のペアにadd(name, value)
を使用します。
答えはどれも私にとってはうまくいかなかったので、私はあちこちで遊んで、1つはうまくいきました。誰かが同じ問題に巻き込まれた場合の共有:
輸入:
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();
}
通常、UIスレッドで実行されているコードによって引き起こされる例外を回避するには、プロセスの予想される長さに応じて、ワーカースレッド(スレッドまたは非同期タスク)で要求および応答プロセスを実行します。
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());
}
}
私はそれがそこで誰かを助けることを願っています。
別の方法(MimeCraftなし)は、次のようにします。
parameters = "param1=text¶m2=" + 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");
OKHTTP 3を使用してAPIを介して投稿データを送信する場合は、以下の簡単なコードを試してください
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);
}
});
OKHTTP 3 GETおよびPOST request here:- https://trinitytuts.com/get-and-post-request- using-okhttp-in-Android-application /