リクエストの作成にAndroid Volleyを使用しています。そこで、このコードを使用します。私は一つのことを理解していません。サーバーでparamsが常にnullであることを確認します。 getParams()が機能していないと思います。この問題を解決するにはどうすればよいですか。
RequestQueue queue = MyVolley.getRequestQueue();
JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,SPHERE_URL,null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
System.out.println(response);
hideProgressDialog();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
hideProgressDialog();
}
}) {
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("id","1");
params.put("name", "myname");
return params;
};
};
queue.add(jsObjRequest);
このヘルパークラスを使用してみてください
import Java.io.UnsupportedEncodingException;
import Java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
import com.Android.volley.NetworkResponse;
import com.Android.volley.ParseError;
import com.Android.volley.Request;
import com.Android.volley.Response;
import com.Android.volley.Response.ErrorListener;
import com.Android.volley.Response.Listener;
import com.Android.volley.toolbox.HttpHeaderParser;
public class CustomRequest extends Request<JSONObject> {
private Listener<JSONObject> listener;
private Map<String, String> params;
public CustomRequest(String url, Map<String, String> params,
Listener<JSONObject> reponseListener, ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
public CustomRequest(int method, String url, Map<String, String> params,
Listener<JSONObject> 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<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(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(JSONObject response) {
// TODO Auto-generated method stub
listener.onResponse(response);
}
}
アクティビティ/フラグメントでこれを使用してください
RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, this.createRequestSuccessListener(), this.createRequestErrorListener());
requestQueue.add(jsObjRequest);
カスタムJSONObjectReuqest
を作成し、getParams
メソッドをオーバーライドするか、コンストラクターでそれらをJSONObject
として提供して、リクエストの本文に入れることができます。
このように(コードを編集しました):
JSONObject obj = new JSONObject();
obj.put("id", "1");
obj.put("name", "myname");
RequestQueue queue = MyVolley.getRequestQueue();
JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,SPHERE_URL,obj,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
System.out.println(response);
hideProgressDialog();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
hideProgressDialog();
}
});
queue.add(jsObjRequest);
私にとって簡単なもの!私は数週間前にそれを得ました:
これは、getBody()
メソッドではなく、postリクエストのgetParams()
で行われます。
ここに私のものがあります:
@Override
/**
* Returns the raw POST or PUT body to be sent.
*
* @throws AuthFailureError in the event of auth failure
*/
public byte[] getBody() throws AuthFailureError {
// Map<String, String> params = getParams();
Map<String, String> params = new HashMap<String, String>();
params.put("id","1");
params.put("name", "myname");
if (params != null && params.size() > 0) {
return encodeParameters(params, getParamsEncoding());
}
return null;
}
(POST getParamsで作成したパラメーターを使用すると仮定しました)
コンストラクター内でリクエストにパラメーターを指定しましたが、その場でリクエストを作成しているため、getBody()メソッドのオーバーライド内でハードコーディングできます。
これは私のコードのようです:
Bundle param = new Bundle();
param.putString(HttpUtils.HTTP_CALL_TAG_KEY, tag);
param.putString(HttpUtils.HTTP_CALL_PATH_KEY, url);
param.putString(HttpUtils.HTTP_CALL_PARAM_KEY, params);
switch (type) {
case RequestType.POST:
param.putInt(HttpUtils.HTTP_CALL_TYPE_KEY, RequestType.POST);
SCMainActivity.mRequestQueue.add(new SCRequestPOST(Method.POST, url, this, tag, receiver, params));
さらに最後の文字列paramsが必要な場合:
param = JsonUtils.XWWWUrlEncoder.encode(new JSONObject(paramasJObj)).toString();
paramasJObjは次のようなものです。{"id"="1","name"="myname"}
通常のJSON文字列。
JsonObjectリクエストで作業する場合、初期化でリンクを渡した直後にパラメーターを渡す必要があります。次のコードを見てください。
HashMap<String, String> params = new HashMap<>();
params.put("user", "something" );
params.put("some_params", "something" );
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, "request_URL", new JSONObject(params), new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// Some code
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//handle errors
}
});
}
一度同じ問題が発生しました。空のPOST配列はリクエストのリダイレクト(サーバー側)が原因で発生します。URLを修正して、サーバーにヒットしたときにリダイレクトされる必要がないようにします。たとえば、サーバー側アプリで.htaccessファイルを使用してhttpsを強制する場合は、クライアントリクエストのプレフィックスが「https://」であることを確認してください。通常、リダイレクトが発生すると、POST配列は失われます。これがお役に立てば幸いです!
オーバーライド関数getParamsは正常に機能します。 POSTメソッドを使用し、jBodyをnullに設定しました。それが動作しない理由です。 null jBodyを送信する場合は、GETメソッドを使用できます。メソッドgetParamsをオーバーライドしており、GETメソッド(およびnull jBody)またはPOSTメソッド(およびjBody!= null)のいずれかで動作します。
また、すべての例があります here
必要なことは、RequestクラスのgetParamsメソッドをオーバーライドすることだけです。私は同じ問題を抱えていて、答えを探しましたが、適切なものを見つけることができませんでした。問題はgetリクエストとは異なり、サーバーによってリダイレクトされているpostパラメーターがドロップされる場合があります。たとえば、 this と読みます。したがって、リクエストがウェブサーバーによってリダイレクトされる危険はありません。 http:// example/myapp をターゲットにしている場合、サービスの正確なアドレス、つまり http://example.com/myapp/index.php 。
ボレーは問題なく、完全に動作します。問題は他のどこかに起因します。