반응형
OkHttp Post Body as JSON
그래서 Koush의 Ion을 사용했을 때 간단한 방법으로 게시물에 json 본문을 추가 할 수있었습니다. .setJsonObjectBody(json).asJsonObject()
OkHttp로 넘어 가고 있는데 정말 좋은 방법을 찾지 못했습니다. 여기저기서 오류 400이 발생합니다.
누구나 아이디어가 있습니까?
나는 심지어 수동으로 그것을 json 문자열로 형식화하려고 시도했습니다.
String reason = menuItem.getTitle().toString();
JsonObject json = new JsonObject();
json.addProperty("Reason", reason);
String url = mBaseUrl + "/" + id + "/report";
Request request = new Request.Builder()
.header("X-Client-Type", "Android")
.url(url)
.post(RequestBody
.create(MediaType
.parse("application/json"),
"{\"Reason\": \"" + reason + "\"}"
))
.build();
client.newCall(request).enqueue(new com.squareup.okhttp.Callback() {
@Override
public void onFailure(Request request, IOException throwable) {
throwable.printStackTrace();
}
@Override
public void onResponse(Response response) throws IOException {
if (!response.isSuccessful()) throw new IOException(
"Unexpected code " + response);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "Report Received", Toast.LENGTH_SHORT).show();
}
});
}
});
/*Ion.with(getContext(), url)
.setHeader("X-Client-Type", "Android")
.setJsonObjectBody(json)
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
Toast.makeText(context, "Report Received", Toast.LENGTH_SHORT).show();
}
});*/
편집 : 나중에이 질문에 걸려 넘어지는 사람을 위해 모든 것을 비동기 적으로 수행하는 솔루션이 있습니다. 선택한 답변이 정확하지만 내 코드가 약간 다릅니다.
String reason = menuItem.getTitle().toString();
if (reason.equals("Copyright"))
reason = "CopyrightInfringement";
JsonObject json = new JsonObject();
json.addProperty("Reason", reason);
String url = mBaseUrl + "/" + id + "/report";
String jsonString = json.toString();
RequestBody body = RequestBody.create(JSON, jsonString);
Request request = new Request.Builder()
.header("X-Client-Type", "Android")
.url(url)
.post(body)
.build();
client.newCall(request).enqueue(new com.squareup.okhttp.Callback() {
@Override
public void onFailure(Request request, IOException throwable) {
throwable.printStackTrace();
}
@Override
public void onResponse(Response response) throws IOException {
if (!response.isSuccessful()) throw new IOException(
"Unexpected code " + response);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "Report Received", Toast.LENGTH_SHORT).show();
}
});
}
});
/*Ion.with(getContext(), url)
.setHeader("X-Client-Type", "Android")
.setJsonObjectBody(json)
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
Toast.makeText(context, "Report Received", Toast.LENGTH_SHORT).show();
}
});*/
...
private void runOnUiThread(Runnable task) {
new Handler(Looper.getMainLooper()).post(task);
}
주로 UI 작업을 수행하기 위해 UI 스레드로 돌아 가야하기 때문에 약간 더 많은 작업이 필요하지만 HTTPS의 이점이 있습니다.
JSONObject.toString();
방법을 사용하십시오 . OkHttp의 튜토리얼을 살펴보십시오.
public static final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) 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();
}
또 다른 접근 방식은 FormBody.Builder()
.
다음은 콜백의 예입니다.
Callback loginCallback = new Callback() {
@Override
public void onFailure(Call call, IOException e) {
try {
Log.i(TAG, "login failed: " + call.execute().code());
} catch (IOException e1) {
e1.printStackTrace();
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// String loginResponseString = response.body().string();
try {
JSONObject responseObj = new JSONObject(response.body().string());
Log.i(TAG, "responseObj: " + responseObj);
} catch (JSONException e) {
e.printStackTrace();
}
// Log.i(TAG, "loginResponseString: " + loginResponseString);
}
};
Then, we create our own body:
RequestBody formBody = new FormBody.Builder()
.add("username", userName)
.add("password", password)
.add("customCredential", "")
.add("isPersistent", "true")
.add("setCookie", "true")
.build();
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(this)
.build();
Request request = new Request.Builder()
.url(loginUrl)
.post(formBody)
.build();
Finally, we call the server:
client.newCall(request).enqueue(loginCallback);
You can create your own JSONObject
then toString()
.
Remember run it in the background thread like doInBackground
in AsyncTask
.
// create your json here
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("username", "yourEmail@com");
jsonObject.put("password", "yourPassword");
jsonObject.put("anyKey", "anyValue");
} catch (JSONException e) {
e.printStackTrace();
}
OkHttpClient client = new OkHttpClient();
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
// put your json here
RequestBody body = RequestBody.create(JSON, jsonObject.toString());
Request request = new Request.Builder()
.url("https://yourUrl/")
.post(body)
.build();
Response response = null;
try {
response = client.newCall(request).execute();
String resStr = response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
참고URL : https://stackoverflow.com/questions/34179922/okhttp-post-body-as-json
반응형
'program tip' 카테고리의 다른 글
상대 URL 경로를 절대 경로로 확인 (0) | 2020.12.12 |
---|---|
TFS가 각 프로젝트를 자체 디렉터리에 출력하도록하는 가장 좋은 방법은 무엇입니까? (0) | 2020.12.12 |
MockitoJUnitRunner는 더 이상 사용되지 않습니다. (0) | 2020.12.11 |
C ++ 정적 초기화 순서 문제 찾기 (0) | 2020.12.11 |
SQL Server에서 시간을 어떻게 비교할 수 있습니까? (0) | 2020.12.11 |