3

重複の可能性:
HTTP が引用符をエスケープしないようにするにはどうすればよいですか?

JSONObject を作成し、JSON 文字列を POST リクエスト本文でサーバーに送信しています。

public String toJson() {
    JSONObject filter = new JSONObject();
    try {
        filter.put("gender", gender.getCode());
        filter.put("feature_id", productCategory);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    JSONObject filterObject = new JSONObject();
    try {
        filterObject.put("filter", filter);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return filterObject.toString();
}

だから私はリクエストを作成しています:

private IJsonExecutorInterface requestExecutorForRelativePathAndParams(String path, WebParams params) throws UnsupportedEncodingException {
    HttpPost postRequest = new HttpPost(rootUrl + path);

    if(params != null) {
        postRequest.setHeader("content-type", params.getContentType());
        postRequest.setEntity(params.getFormEntity());
    }

    // Blah blah

    return executor;
}

public IJsonExecutorInterface getProducts(ProductFilter filter, int offset, int limit) throws UnsupportedEncodingException {
    WebParams webParams = new WebParams();
    webParams.addPair("filter", filter.toJson());
    webParams.addPair("offset", String.format("%d", offset));
    webParams.addPair("limit", String.format("%d", limit));
    return requestExecutorForRelativePathAndParams("products", webParams);
}

// WebParams class


public class WebParams {
    private ArrayList<NameValuePair> params;
    private String contentType = "application/x-www-form-urlencoded";

    public WebParams() {
        params = new ArrayList<NameValuePair>();
    }

    public void addPair(String name, String value) {
        params.add(new BasicNameValuePair(name, value));
    }

    public String getContentType() {
        return contentType;
    }

    public HttpEntity getFormEntity() throws UnsupportedEncodingException {
        return new UrlEncodedFormEntity(params);
    }
}

デバッガーに表示されます。問題ありません。

しかし、私のサーバーでは、次のようなものが得られます。

Array
(
    [filter] => {\"gender\":\"w\",\"feature_id\":\"41_7459\"}
    [offset] => 0
    [limit] => 18
)

引用符はエスケープされます。

サーバー上の何かを置き換えたくありません。replace("\\\"", "\"")Java では、文字列には影響しません。

4

2 に答える 2

1

ドキュメントによると、「URLエンコードされたペアのリストで構成されるエンティティ」([http://developer.android.com/reference/org/apache/http/client/entity]であるUrlEncodedFormEntityを使用しているようです/UrlEncodedFormEntity.html])。私はこれを使用したことはありませんが、URL パラメーターではなく投稿本文でデータを送信しているため、あなたが望むものとは思えません。

以前にこのクラスを使用してStringEntityjson データをポスト経由で送信しましたが、名前と値のペアではなく文字列のみをエンコードするため、処理したい形式に文字列を配置するにはもう少し作業を行う必要がありますサーバー上で:

public class WebParams {
    private ArrayList<NameValuePair> params;
    private String contentType = "application/x-www-form-urlencoded";

    public WebParams() {
        params = new ArrayList<NameValuePair>();
    }

    public void addPair(String name, String value) {
        params.add(new BasicNameValuePair(name, value));
    }

    public String getContentType() {
        return contentType;
    }

    public HttpEntity getFormEntity() throws UnsupportedEncodingException {
        //TODO: Build a string in what ever format you want. 
        //      This will include the gender & feature_id fields as well as the json
        StringBuilder b = new StringBuilder();
        for(NameValuePair nvp : params) {
           builder.append(nvp.getName()).append('=').append(nvp.getValue()).append(',');
        }

        //Now that we have a string to send to the server, get your entity!
        StringEntity entity = new StringEntity(b.toString());
        entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        return entity;
    }
}
于 2012-06-25T19:11:33.257 に答える
0

二重引用符の代わりに単純な引用符を使用することに問題はありますか? それがあなたの問題を解決すると思うからです。

于 2012-06-25T18:38:33.707 に答える