Используйте Google volley api для отправки HTTP POST-запроса данных RDF
Итак, я недавно интегрировал API-интерфейс Volley в свое приложение, чтобы предоставить решение облачного хранилища (REST). С тех пор я никогда не использовал API прежде, чем у меня возникли проблемы при попытке отправить данные RDF (text/turtle) через HTTP POST. Сервер REST работает отлично, так как я отправляю запросы GET и POST (через приложение Postman Chrome) и каждый раз получаю 200 и 201 ответы. Хотя мне удалось отправить простой запрос GET через API, при отправке HTTP POST я получаю сообщение об ошибке 400.
Код следующий:
//the RDF turtle payload to send over HTTP POST
final String bodyPost = "@prefix : <http://xxx.xxx.xxx.gr/xxx/schema/xxx#> ." + "\n" +
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> ." + "\n" +
"[a :Patient ;" + "\n" +
":lastName "+'"'+"Aylakiotis"+'"'+"^^xsd:string ; " + "\n" +
":firstName "+'"'+"Yiannis"+'"'+"^^xsd:string ;" + "\n" +
":dateOfBirth "+'"'+"1970-04-14"+'"'+"^^xsd:date ;" + "\n" +
":amka "+'"'+"12345678903"+'"'+"^^xsd:string ;" + "\n" +
":gender :Male ;" + "\n" +
"] .";
RequestQueue queue = Volley.newRequestQueue(this);
final String URL ="http://xxx.xxx.xxx:8080/xxx/";
EditText folderTitle = (EditText) findViewById(R.id.folderTitle);
StringRequest strReq = new StringRequest(Request.Method.POST, URL,
new Response.Listener() {
@Override
public void onResponse(Object response) {
folderTitle.setText("Response is: " + response.toString().substring(0,500));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
folderTitle.setText("Error: " + error.getMessage());
}
}) {
@Override
public byte[] getBody() throws AuthFailureError {
System.out.println("string post data: " + bodyPost);
if (params != null && params.size() > 0) {
System.out.println("string post data: " + bodyPost);
return encodeParameters(params, getParamsEncoding());
}
return bodyPost.getBytes();
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
String creds = String.format("%s:%s", "xxx", "xxx");
String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT);
headers.put("Authorization", auth);
headers.put("Content-Type", "text/turtle");
return headers;
}
};
// Add the request to the RequestQueue.
queue.add(strReq);
String bodyPost
полезная нагрузка данных, которую я хочу отправить в формате RDF. Я помещаю это в мой getBody()
метод, однако я все еще получаю 400 плохих запросов. Я уже отправил эту строку через POST http через приложение Postman Chrome, и она работает (201 Created). Я видел, что большинство реализаций было getParams()
но это требует пар ключ / значение, тогда как я использую тройки, которые я хочу отправить как целую строку необработанных данных
1 ответ
Установите тип контента на текст / черепаха. Переопределите заголовок вашего запроса следующим образом:
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
final HashMap<String, String> params = new HashMap<String, String>();
params.put("Content-Type", "text/turtle");
return params;
}