java правильное формирование RequestBody для Post запроса
Есть сайт, на который я отправляю POST-запрос с английским текстом и в ответ получаю перевод. Вот так выглядит мой код
public void testPromt() throws Exception {
List<String> dzenArticleUrls = new ArrayList<>();
String text = "";
String translatetext = URLEncoder.encode(text, "utf-8");
HttpClient client = new HttpClient();
PostMethod post = new PostMethod("https://www.translate.ru/services/soap.asmx/GetTranslation");
post.addRequestHeader("Host", "www.translate.ru");
post.addRequestHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0");
post.addRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01");
post.addRequestHeader("Accept-Language", "en-US,en;q=0.5");
post.addRequestHeader("Accept-Encoding", "gzip, deflate, br");
post.addRequestHeader("Referer", "https://www.translate.ru/");
post.addRequestHeader("Content-Type", "application/json; charset=utf-8");
post.addRequestHeader("X-Requested-With", "XMLHttpRequest");
post.setRequestBody("{ dirCode:'en-ru', template:'General', text:'Some text from me', lang:'ru', limit:'3000',useAutoDetect:true, key:'123', ts:'MainSite',tid:'', IsMobile:false}");
post.setRequestBody(body);
int statudcode = client.executeMethod(post);
String postRespose = post.getResponseBodyAsString();
}
Данный код работает, я получаю перевод. Строка в методе setRequestBody полностью скопирована из браузера.
Проблема в том, что метод setRequestBody принимающий строку устаревший. Сейчас setRequestBody принимает на вход NameValuePair . Соответственно я переписал код таким образом:
public void testPromt() throws Exception {
List<String> dzenArticleUrls = new ArrayList<>();
String text = "";
String translatetext = URLEncoder.encode(text, "utf-8");
HttpClient client = new HttpClient();
PostMethod post = new PostMethod("https://www.translate.ru/services/soap.asmx/GetTranslation");
post.addRequestHeader("Host", "www.translate.ru");
post.addRequestHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0");
post.addRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01");
post.addRequestHeader("Accept-Language", "en-US,en;q=0.5");
post.addRequestHeader("Accept-Encoding", "gzip, deflate, br");
post.addRequestHeader("Referer", "https://www.translate.ru/");
post.addRequestHeader("Content-Type", "application/json; charset=utf-8");
post.addRequestHeader("X-Requested-With", "XMLHttpRequest");
NameValuePair[] body = {
new NameValuePair("dirCode", "en-ru"),
new NameValuePair("template", "General"),
new NameValuePair("text", "Some text from me"),
new NameValuePair("lang", "ru"),
new NameValuePair("limit", "3000"),
new NameValuePair("useAutoDetect", "true"),
new NameValuePair("key", "123"),
new NameValuePair("ts", "MainSite"),
new NameValuePair("tid",""),
new NameValuePair("IsMobile", "false")
};
post.setRequestBody(body);
int statudcode = client.executeMethod(post);
String postRespose = post.getResponseBodyAsString();
}
При отправке statuscode возвращает 500. А в postResponse я вижу это {"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""}
Из-за чего такое может быть, если все параметры NameValuePair я указал также, как и в строке setRequestBody
Ответы (1 шт):
Ответом будет замена этого куска кода
NameValuePair[] body = {
new NameValuePair("dirCode", "en-ru"),
new NameValuePair("template", "General"),
new NameValuePair("text", "Some text from me"),
new NameValuePair("lang", "ru"),
new NameValuePair("limit", "3000"),
new NameValuePair("useAutoDetect", "true"),
new NameValuePair("key", "123"),
new NameValuePair("ts", "MainSite"),
new NameValuePair("tid",""),
new NameValuePair("IsMobile", "false")
};
post.setRequestBody(body);
на этот
post.setRequestEntity( new StringRequestEntity("{ dirCode:'en-ru', template:'General', text:'Some text from me', lang:'ru', limit:'3000',useAutoDetect:true, key:'123', ts:'MainSite',tid:'', IsMobile:false}","application/json","UTF-8") );
Спасибо @tym32167 за то, что мне пришлось еще раз внимательнее дебажить код