2016-04-07 11 views
1

kullanıyorum, sunucuya Files gönderin. Aşağıdaki kodu kullanıyorum:getParams, StringRequest Android'de arama yapmıyor

final MultipartEntityBuilder mHttpEntity = buildMultipartEntity(files_to_upload, params); 

     Response.Listener<String> rListner = new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       if(response != null) { 
        Intent intent = new Intent(Constants.ACTION_RESPONSE_RECEIVED); 
        intent.putExtra(Constants.RESPONSE, response); 
        intent.putExtra(SignupActivity.EXTRA_ACTION_RESPONSE, SignupActivity.EXTRA_SIGNUP_DATA); 
        LocalBroadcastManager.getInstance(MyApplication.getContext()).sendBroadcast(intent); 
       } 
      } 
     }; 

     Response.ErrorListener errorListner = new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Intent intent = new Intent(Constants.ACTION_RESPONSE_RECEIVED); 
       LocalBroadcastManager.getInstance(MyApplication.getContext()).sendBroadcast(intent); 
       if(error != null && error.getMessage() != null) { 
//     Toast.makeText(MyApplication.getContext(), error.getMessage(), Toast.LENGTH_SHORT).show(); 
       } 
       else { 
        Log.i(TAG, "postRequestToServer: onErrorResponse : error message null"); 
       } 
      } 
     }; 

     StringRequest jsonObjectRequest = new StringRequest(Request.Method.POST, url, rListner, errorListner) 
     { 
      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 
       return params; 
      } 

//   @Override 
//   public Map<String, String> getHeaders() throws AuthFailureError { 
//    return params; 
//   } 

      @Override 
      public String getBodyContentType() { 
       return mHttpEntity.build().getContentType().getValue(); 
      } 
// 
      @Override 
      public byte[] getBody() throws AuthFailureError { 
       ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
       try { 
        mHttpEntity.build().writeTo(bos); 
       } catch (IOException e) { 
        VolleyLog.e("IOException writing to ByteArrayOutputStream"); 
       } 
       return bos.toByteArray(); 
      } 
     }; 

private MultipartEntityBuilder buildMultipartEntity(String files_to_upload, HashMap<String, String> params) { 

     MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 

     String[] arr_files = files_to_upload.split("##"); 
     for(int i = 0; i < arr_files.length; i++) { 
      String filePath = arr_files[i]; 
      if(filePath == null || filePath.length() == 0) 
       continue; 
      File file = new File(filePath); 
      String extension = MimeTypeMap.getFileExtensionFromUrl(arr_files[i]); 
      String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 

      builder.addBinaryBody("userfile", file, ContentType.create(mimeType), file.getName()); 
//   builder.addPart("userfile", new FileBody(file)); 
     } 

     try { 
      for (String key: params.keySet()) 
       builder.addPart(key, new StringBody(params.get(key))); 
     } catch (UnsupportedEncodingException e) { 
      VolleyLog.e("UnsupportedEncodingException"); 
     } 

     return builder; 
    } 

Ama mesele getParams çağrılan değil mi. Sunucu parametreler bekliyor, ben EntityBuilder kullanarak göndermeye çalıştı ama hala parametreleri gönderme hataları yaşıyorum.

Lütfen herkesin bana StringRequest with Parameters kullanarak nasıl yükleme yapabilirim?

+0

Bildiğim kadarıyla sorunuzu anladım olarak :: Bir 'StringRequest' yapmak için Voleybolu kullandığınızda, bir HTTP GET yapma yanıt olarak tex/düz bekliyoruz. .. Bir POST olarak değiştirdiğinizde, ilgili içerik için [bu bağlantıyı kontrol edebilirsiniz] (http://stackoverflow.com/a/16795805/4903925) ... – Bonatti

+0

Hayır, verileri göndermek için yazı kullanıyorum. 'getParams'ı geçersiz kıldığım zaman çağrılmıyor getBody()' 'Parameters' –

cevap

0

StringRequest.java, Request.java'dan miras aldığı için getParams() yönteminiz aranmıyor. Şimdi Request.java içinde,() yöntemini getBody çağrılan oluyor() Eğer getParams görebilirsiniz

public byte[] getBody() throws AuthFailureError { 
     Map<String, String> params = getParams(); 
     if (params != null && params.size() > 0) { 
      return encodeParameters(params, getParamsEncoding()); 
     } 
     return null; 
    } 

, getBody() yöntemine bakarsak. Artık isteğinizi StringRequest jsonObjectRequest yaparken, getParams() yönteminin çağrılmadığı anlamına gelen getBody() yöntemini geçersiz kılıyorsunuz. GetParams() 'ın neden çağrılmamasının nedeni budur.

DÜZENLEME Şimdi bu sınıfın aracılığıyla istek göndermek isteği yapıcısı

public class CustomRequest extends Request<String> { 

    private Listener<String> listener; 
    private Map<String, String> params; 

    public CustomRequest(int method, String url, Map<String, String> params, 
      Listener<String> reponseListener, ErrorListener errorListener) { 
     super(method, url, errorListener); 
     this.listener = reponseListener; 
     this.params = params; 
    } 

    protected Map<String, String> getParams() 
      throws com.android.volley.AuthFailureError { 
     return params; 
    }; 

    @Override 
    protected Response<String> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
      return Response.success(jsonString, HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (UnsupportedEncodingException e) { 
      return Response.error(new ParseError(e)); 
     } catch (JSONException je) { 
      return Response.error(new ParseError(je)); 
     } 
    } 

    @Override 
    protected void deliverResponse(String response) { 
     listener.onResponse(response); 
    } 
} 

içindeki params alır bu özel voleybolu isteği sınıf oluşturun. getParams() 'ı geçersiz kılmak yerine, sadece paramızlarınız için bir hashmap oluşturun ve bunları kurucunun içine aktarın.

+0

ile istek nasıl yapılır Sonra parametreleri nasıl gönderilir? –

+0

Bununla, dosya gönderemezsiniz. Dosyayı yollamak için 'getBody''i geçersiz kıldım. –

+0

bu sınıf, Request sınıfından uzanır. 'GetBody()' yöntemini –

0

Kullanım getparams ve getHeader metods:

@Override 
protected Map<String, String> getParams() throws AuthFailureError { 
    Map<String, String> parameters = new HashMap<String, String>(); 
    parameters.put("product_id", "4"); 
    parameters.put("count", Productcount.getText().toString()); 
    parameters.put("type", cashstatus); 
    parameters.put("description", "Matn bo'ladi"); 
    parameters.put("phone_number", "946287009"); 
    parameters.put("on_map", address); 
    return parameters; 
} 

@Override 
public Map<String, String> getHeaders() throws AuthFailureError { 
    Map<String, String> headers = new HashMap<String, String>(); 
    headers.put("Authorization", "Bearer " + token); 
    return headers; 
} 
İlgili konular