#java #android #android-volley
#java #Android #android-volley
Вопрос:
Я использую MultipartRequest
Volley
Post
запрос на отправку, я получаю ошибку сервера
BasicNetwork.performRequest: неожиданный код ответа 500
Сервер принимает запрос Postman
без проблем.
Кроме того, я http://httpbin.org/post
проверял, прикреплены ли изображение и параметры, и мне кажется, что все в порядке. Кто-нибудь может мне помочь с этим. Пробовал искать часами, но так и не смог решить эту проблему.
Ответ Httpbin
{
"args":{
},
"data":"",
"files":{
"image":"data:application/octet-stream;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAcCBDgDASIAAhEBAxEB/8QAHwABAAICAwEBAQEAAAAAAAAAAAgJBwoEBQYDAgEL/8QAgRAAAAYCAQEEAgUQEREEBAAfAAECAwQFBgcIEQkSEyEUMRUiQVeWFhcYGTI4UWFxdpKxtcHV1iM2N1NWdXeBkaGms7S20dPUCiQzNDU5Qlhyc3STlZey4fBSVJTxGiVigrfCQ2N4hcXSJlWGotcnREZkZ4SYw8TGKTpFSGiDh/L/xAAeAQEAAAcBAQEAAAAAAAAAAAAAAQMEBQYHCAIJCv/EAIURAAEDAgICBRENDwoPDAgGAwABAgMEBQYREiEHEzFRYRQWFxhBVFVWcZOUlbHR09TwCAkVIjI1U3SBkcHS1RkzN1JXcnWSlqGlsrO01iM2QmJzdqO1wvEnOENHZWZnaISGpKfh5OckKDRERWNkd4KiprYlOUiDh7fj5SZGhcTi8njD5v/aAAwDAQACEQMRAD8A3OAH4ccbaQpx1xDTaS6qW4pKEJL1dVKUZJIuvl5mOMmxr1qShE GtajJKUplMKUpR RElJLMzMz8iIi6mAOYAAAAD5OvssJ777zTKOpF33XENp6n6i7yzSXU/cLqPi3PgurS21NiOuKPoltuSytajIjMySlKzUZ9CM/Ij8iMwBywAAAAAAAAGANtcpNCaNsItTtDZNBi9vMbQ8xUvuuyrLwF9O5IdhQmpD7DKiPqlx5CEqT5pMy8wBn8B4fXmysD2vjUbL9dZRUZbjkta2mrOnlJkMpfa6eLHfSXR2PJb7yTWw ht1JKSZp6KIz9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwTsjk3oPUV9ExjY 1MRxPIZiGXWqizskJnIZkd3wHpTDSXVQ2niWlba5XhEttSXE9WzJR5fr7 ktqWPkdbbV06hlwisY1xFlsPVr0BTfilLbmNrUwqP4ZGs3SX3CSRmZl0MAduAj7ivKzjpm Znr3Fdv4Vd5ib7kVmkh2zSpEuU0ruuRoLiiTHmvkr2pNRXnVrPybJR QkEAAAAAAAAAACuveHaaaF0Fsi91fmWObOm5Bj5sFMk0FJjsurc9Ib8RBxn5uV10lZEn5rxIjRkfqIy8wBYoAx5qfZdFuLXWKbNxmNZw6HMK47OsjXLMaPaNRylSIndmMRJc6M26bkZaiS1LeT3DSZqJRmlPnducg9N6JiwZW1c9o8Q9k 97HRZ7yl2E5KDNK3I0CMh6W60hRGlTqWvDJRGnvd4jIAZlAYt1XurVu7aV6/1bmtLmNbFdSxNcq5HefgvLI1IanQ3Utyoi1klRoJ9lBL7qu6Z90 mUgAAAAAAET UHMTWXE2NjEvY9RmfWxC/jBUDU217rqbsGDdKxoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//Z"
},
"form":{
"email":"emirdeed@gmail.com",
"emailText":"Hallo,nes ist jetzt ganz einfach, selbst aktiv etwas gegen das Insekten- und Bienensterben und f?r mehr Biodiversit?t zu tun. Privaten G?rten und Balkonen kommt dabei eine sehr wichtige Aufgabe zu, z. B. durch die richtige Auswahl der Pflanzen. Im Anhang siehst du den ?koscan von meinem Garten, der auf www.example.de erstellt wurde. Hier kannst Du ganz einfach in der Pflanzensuche insektenfreundliche Pflanzen finden und Pflanzen per Foto bestimmen. Die Anwendung ist ?brigens kostenlos.nVielleicht hast du ja Lust, deinen eigenen Garten auch mal zu checken.nnViele Gr??e,n",
"fromMail":"example@example.com",
"fromName":"Amir",
"toName":"receiver name"
},
"headers":{
"Accept-Encoding":"gzip",
"Authorization":"Bearer BAN4vrbQLvp6J5xLVx_VEY1_Pa1lNqhtLUqwRWGrvQbUh2FEwY7YQOSSAm2Ptj6nDgSltyP2qhd_7f5U6A0hl1gbm6m-1gt6qWQuM1PTkr_BqfM9KgsMTv-pECNHvcYqkytTRbC8WzgA32WDN9u3_VE_2Vqv7SEXJtd946bMFKslp_iLQfVxlalGXEm_XdonJgBGEzH83tdeJEqQ5GnjzE0HEmHoGRek911j6TwL0fUWDfXWSSW057EeKEB5krvqFdZJSSavdWeP4UM0E7PnubDieR7dSkBpk5JX8MRJ7dx0IgnWjFavTwakQdtwdqJDVzm12IHhsmOZk45YBAoc0A",
"Content-Length":"343844",
"Content-Type":"multipart/form-data; boundary=zoPsBEe7D03JvmRPNkldtWEY7g7cNl6QiSVpjqIE; charset=US-ASCII",
"Host":"httpbin.org",
"User-Agent":"Dalvik/2.1.0 (Linux; U; Android 9; AOSP on IA Emulator Build/PSR1.180720.117)",
"X-Amzn-Trace-Id":"Root=1-5f9722f1-20f1e81d2b9a54616d2090d7"
},
"json":null,
"origin":"194.95.1.95",
"url":"http://httpbin.org/post"
}
метод отправки Volley
private void emailFile(Bitmap bitmap) {
File savedPdfFile = new File(getActivity().getFilesDir(), file_name_path);
String scanEmailUrl = "https://examplebackend.sslbeta.de/api/AccountAPI/sendScanMail";
//String scanEmailUrl = "http://httpbin.org/post";
File file = bitmapToFile(bitmap,"example_ecoscan");
// Add binary body
if (file != null) {
HashMap<String, String> params = new HashMap<String, String>();
params.put("email", "emirdeed@gmail.com");
params.put("emailText", emailMsgEdtText.getText().toString());
params.put("fromMail", "example@example.com");
params.put("fromName", "Amir");
params.put("toName", "receiver name");
MultipartRequest myRequest = new MultipartRequest(getActivity(), file, params, scanEmailUrl, new Response.Listener<String>(){
@Override
public void onResponse(String response) {
Log.d("response", response);
Toast.makeText(getContext(), "email sent", Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError e) {
Log.d("ReadRdaJSONFeedTask", e.getLocalizedMessage() == null ? "" : e.getLocalizedMessage());
Toast.makeText(getContext(), e.getLocalizedMessage() == null ? "" : e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
}
});
myRequest.setRetryPolicy(new DefaultRetryPolicy(10000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
RequestQueueSingleton.getInstance(getContext()).addToRequestQueue(myRequest);
}
}
Класс MultipartRequest
public class MultipartRequest extends Request<String> {
private MultipartEntity entity = new MultipartEntity();
private static final String FILE_PART_NAME = "image";
private final Response.Listener<String> mListener;
private final File file;
private final HashMap<String, String> params;
private Context context;
public MultipartRequest(Context context, File file, HashMap<String, String> params, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
super(Method.POST, url, errorListener);
mListener = listener;
this.file = file;
this.params = params;
this.context = context;
buildMultipartEntity();
}
private void buildMultipartEntity() {
entity.addPart(FILE_PART_NAME, new FileBody(file));
try {
for (String key : params.keySet()) {
entity.addPart(key, new StringBody(params.get(key)));
}
} catch (UnsupportedEncodingException e) {
VolleyLog.e("UnsupportedEncodingException");
}
}
@Override
public String getBodyContentType() {
return entity.getContentType().getValue();
}
@Override
public byte[] getBody() throws AuthFailureError {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
entity.writeTo(bos);
} catch (IOException e) {
VolleyLog.e("IOException writing to ByteArrayOutputStream");
}
return bos.toByteArray();
}
/**
* copied from Android StringRequest class
*/
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
ApplicationUser user = PreferencesUtility.getUser(context);
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "Bearer " user.getToken());
return headers;
}
@Override
protected void deliverResponse(String response) {
mListener.onResponse(response);
}
}
Postman
рабочий пример, httpbin.org/post
ответ
{
"args": {},
"data": "",
"files": {
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArsAAAJWCAYAAABYuU/eAACAAElEQVR42uy9CXRc9ZXue1TzrHmWJVnzPM/zPA lWbJkTZblkcHGNsYYG4PBGEMcx3EIcAmhadrX1 1LOzQhPJrQhE7oNJ2mOwmXy6K5PB6LTnNzeTwvlheL5aW133//zzlVp0pVkmzLtiTvb629qlSSSqoqVelX 3z724JAIpFIJBKJRCKRSCQSaVVIRXcBiUQikUgkEmmtAa5GKpWiSCQSiUQikUikNQG7Og wS8BLIpFIJBKJRFpz4EuwSyKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRrlOY5WuQTkkkEolEIpFIpDUllQS7FgJeEolEIpFIJNJahl6CXRKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgk0s0Q lb9WIWximAVxSqWVRyrBJ1Ol2az2UqiwoLb4mIiNsTGRm6Njo64MyIscGeQv s2WwY1 nUw2qdepB97Qajkdcwq16NRtPErqOMVQ6rFOl6w6Sfp6O7nkQikUgkEol0zUpLE3RBQaYIBqFZDDzr1Gp1LwPTMZNJP2s1G3f7Wi2P2CyWp6xW44s2m/mcr6/tnL /7VyAn/WCv6/t1eBAv7ciw4PfXx8d8Xn8 shvYqMj5iLCgiE0JABCgvyBfR4C/G1X/Hwtl31tlktY7Pwlf1/rN/5 Njz/Z5vF/JnRaPhQp9W85 Pj84ZKpTrHfrWnWB1jtZ/VLKteVjWsshCwpULYjmYVIsGxRQJkFT2yJBKJRCKRSLeHVFarNchisWRYDIYao9HY72 z7IwIDz0WHBxw1mYzvWOxGD 0mE1fmkzGb80m45zFbAR2GSsTWFnZrGZeDFSBASr4sWIQDL6 Fn6ZlX3ObDKA0agHvV4Hep2WlY6fN7AyGvSsDGAyimU0Os b8WexslnxZxnZ9Rjx8ivs 77V6TRfazTqLxn8fszqfXZb3mb1CqsX2MdnWCEM72Y1ycrOqo5VgSB2iBGCgwTqDpNIJBKJRCKtCWEubIRWqy0ymw1jVpPhgM1iOmO1mi4yGH3Pz2b5jIHqV4H vt8GBfozSDWLYGmSABSB1AGjenaqLINLIcRqtRrQapylUWOpQc1KPFXxU14aL6X4HL8 ViIos9JrRXDm8MxrTqfVXGH1LatL7Hu Yj/3SwbEnxsM g/YbX7bbDScZd93UqBvU/cR3Vc0/ 4pAFoqt0pFUqUqPKqDr/qsijqbokqVKlWqWgT0RgjwbSfANEq8IdKdTAB8n/ge9QapStWd8bxXz2VVqlSpUtXi3xDNrUqVKlWq7pD6/zIOZQjiDhPqAAAAAElFTkSuQmCC"
},
"form": {
"email": "example@gmail.com",
"emailText": "some text",
"fromMail": "example@example.com",
"fromName": "Amir",
"toName": "receiver name"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Authorization": "Bearer UkNQV8NSJV7DIZzVhMHXJvH2SCdTtdPL0SVCBP5tj3cSgNnAgdhBYdA8HFb0NUHZYzWkYH0Tf3bdTLU5isyJTcWCPFIQQhDHG_SMkO_WIszDl0T0mYj-kkSyErz4nZtSKZy8I_fnbFyjAuDEEW1khdt1ct1f-Dp5t-vyfHj9hlgyJlyF3d5iroYsLRRbu_gTWD39sWiQR1T31aZTst5kMIz6M9KOtvGAVZIep7soY8LnIN59aMC0ShpmmooIZh21hYhaGGD2NRivZnVHd--dlWUYeQSMayqtTUEF4NqpjcHmLJvK61ZwobM-7ORwNc4R5iBS-6PNVKbrmsE13BGQNw",
"Content-Length": "178556",
"Content-Type": "multipart/form-data; boundary=--------------------------295330887852083842487601",
"Host": "httpbin.org",
"Postman-Token": "7a09709e-996b-47e6-9366-329f4c55bfc9",
"User-Agent": "PostmanRuntime/7.26.5",
"X-Amzn-Trace-Id": "Root=1-5f97d311-48bdfe9b61cff3977e2788a8"
},
"json": null,
"origin": "194.95.1.95",
"url": "http://httpbin.org/post"
}
Комментарии:
1. Пожалуйста, также добавьте рабочий запрос от Postman. Вероятно, Postman устанавливает некоторые заголовки по-разному
2. Одна вещь, которую я вижу, это то, что отправляемое вами изображение
data:application/octet-stream;
, возможно, сервер ожидает конкретный тип изображения, напримерdata:image/jpeg;
, илиdata:image/png;
Postman устанавливает здесь правильный тип…3. Спасибо @derpirscher за ваш комментарий. Я прикрепил ответ postman в формате json. Также я обновлю, работает ли это с изменением типа изображения.