【问题标题】:HttpPost not accepting lengthy url in JavaHttpPost 不接受 Java 中的冗长 url
【发布时间】:2012-12-09 15:23:16
【问题描述】:

这是我的 android 应用程序中的 httppost 方法。它不接受冗长的网址。冗长的网址没有响应/例外。当我在浏览器中手动输入相同的网址时,它工作正常。谁能指出这里的问题?

    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();           

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

更新: 添加了一个示例网址。当在浏览器中手动输入相同的 url 并给出响应时,它可以正常工作。

 url.com/data?format=json&pro={%22merchanturl%22:%22http://url.com/logo.pn‌​g%22,%22price%22:599,%22productDesc%22:%22Apple%2032GBBlack%22,%22prodID%22:%2291‌​3393%22,%22merchant%22:%224536%22,%22prourl%22:%22http://url.com/data%22,%22name%‌​22:%22Apple%2032GB%20%2D%20Black%22,%22productUrl%22:%22http://www.url.com/image.‌​jpg%22,%22myprice%22:550,%22mercname%22:%22hello%22,%22mybool%22:false} 

【问题讨论】:

  • 您使用的网址在哪里?
  • 我无法透露网址。它的官方之一。它是一个 API。当我在浏览器中手动输入相同的 url 时,它可以正常工作。
  • 那我如何验证你的代码?
  • @imran 我已经添加了示例网址

标签: java android json http http-post


【解决方案1】:
public void postData() {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php");

try {
    // Add your data
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("id", "12345"));
    nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    // Execute HTTP Post Request
    HttpResponse response = httpclient.execute(httppost);

} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
} catch (IOException e) {
    // TODO Auto-generated catch block
}
}

【讨论】:

  • 实际上我的 url 中有一个很长的 jsonobject,例如 {"merchantPrice":"7.69","merchantName":"amazon.com"}。实际的 url 有很多这样的 json 参数。这行得通吗?
【解决方案2】:

我想您的网址包含 index.php?call=getUsers&amp;something=bla 之类的内容

要解决这个问题,您可以使用NameValuePair

String url = "http://example.com/index.php";

ArrayList<NameValuePair> nvp = new ArrayList<NameValuePair>();
nvp.add(new BasicNameValuePair("call", "getUsers"));
nvp.add(new BasicNameValuePair("something", "bla"));

try {
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost(url);
    post.setEntity(new UrlEncodedFormEntity(nvp));
    HttpResponse response = client.execute(post);
    HttpEntity entity = response.getEntity();
    [...]
} catch (Exception e) {
    [...]
}

【讨论】:

  • 实际上我的 url 中有一个很长的 jsonobject,例如 {"merchantPrice":"7.69","merchantName":"amazon.com"}。实际的 url 有很多这样的 json 参数。这行得通吗?
  • 你可以试试我下面的答案。
【解决方案3】:

您可以尝试使用以下代码。你应该有Json API

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;

import org.json.JSONException;
import org.json.JSONObject;

public class JsonReader {

  private static String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
  sb.append((char) cp);
}
return sb.toString();
  }

  public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
    InputStream is = new URL(url).openStream();
    try {
      BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
  String jsonText = readAll(rd);
  JSONObject json = new JSONObject(jsonText);
  return json;
} finally {
  is.close();
    }
  }

  public static void main(String[] args) throws IOException, JSONException {
    JSONObject json = readJsonFromUrl("https://graph.facebook.com/19292868552");
    System.out.println(json.toString());
    System.out.println(json.get("id"));
  }

【讨论】:

  • 我的 json 解析器工作正常。我怀疑我有很长的要求。这就是问题所在。反应非常小。这不是问题。
  • 我希望冗长的 URL 不会成为问题。如果您对请求 URL 有任何问题,请与我们分享。会尽力帮助你。
  • 在这里。当我手动输入网址时它工作正常。 url.com/data?format=json&pro={%22merchanturl%22:%22http://url.com/logo.png%22,%22price%22:599,%22productDesc%22:%22Apple%2032GBBlack%22,%22prodID%22:%22913393 %22,%22merchant%22:%224536%22,%22prourl%22:%22http://url.com/data%22,%22name%22:%22Apple%2032GB%20%2D%20Black%22,% 22productUrl%22:%22http://www.url.com/image.jpg%22,%22myprice%22:550,%22mercname%22:%22hello%22,%22mybool%22:false}
猜你喜欢
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
相关资源
最近更新 更多