لماذا لا HttpClient وإصلاحه العمل ولكن HttpUrlConnenction افعل عندما تكون البيانات نشر لشكل

StackOverflow https://stackoverflow.com/questions/2059862

سؤال

وأنا بناء التطبيق الروبوت التي ينبغي إجراء GET على موقعي للحصول على اثنين الكوكيز ثم إجراء آخر لنفس الموقع مع هذه الملفات.

وكما ذكر أبدأ من مع GET وأنا باستخدام org.apache.http.client.HttpClient لتنفيذ هذه العملية.

String requiredCookies = "";
HttpContext localContext = null;

System.out.println("------------------GET----------------------");
HttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet("www.mysitegeturl.com");

//Creating a local instance of cookie store.
CookieStore cookieJar = new BasicCookieStore();

// Creating a local HTTP context
localContext = new BasicHttpContext();

// Bind custom cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieJar);

HttpResponse response;
try {
    response = httpClient.execute(get, localContext);
HttpEntity entity = response.getEntity();
System.out.println(response.getStatusLine());
if (entity != null) {
   System.out.println("Response content length: " + entity.getContentLength());
}

//Do this so that Java.net impl should work
List<Cookie> cookies = cookieJar.getCookies();
for (int i = 0; i < cookies.size(); i++) {
     requiredCookies += cookies.get(i).getName()+"="+cookies.get(i).getValue()+";";
}

if (entity != null) {
    entity.consumeContent();
}

} catch (ClientProtocolException e1) {
        // TODO Auto-generated catch block
 e1.printStackTrace();
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
System.out.println("------------------GET-END---------------------");

وهكذا حتى الآن جيد. لا مانع خط requiredCookies بعد، سيتم استخدامها في Java.net impl منذ أن كنت لا يمكن الحصول على واحد HttpClient وإصلاحه إلى العمل = (. دعونا نلقي نظرة على عدم العمل HttpClient وإصلاحه المشاركة فيها.

System.out.println("------------------HttpClient - POST----------------------");
HttpPost post = new HttpPost("www.mysiteposturl.com");

//Params       
HttpParams params = new BasicHttpParams();

params.setParameter("foo", "post");
params.setParameter("bar", "90");
params.setParameter("action", "search");

post.setParams(params);
post.setHeader("Content-Type", "application/x-www-form-urlencoded");

try {
    HttpResponse response2 = httpClient.execute(post, localContext);
     System.out.println(response2.getStatusLine());
} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}
System.out.println("------------------POST END---------------------");

وماذا يحدث الآن هو أنني إجراء ظيفة مع localContext حيث يتم تخزين ملفات تعريف الارتباط. هذا لا يعمل. أحصل على HTTP / 1.1 401 لا الدورة. منذ لم يكن لدي أي حظ مع هذا حاولت مقاربة أخرى (java.net.HttpURLConnection). أذكر أنني الاستمرار في استخدام نفس الجزء GET

URL url = new URL("www.mysiteposturl");
HttpURLConnection connection = null;

String dataString = "bar=90&foo=post&action=search";

try {
connection = (HttpURLConnection)url.openConnection();
connection.setRequestProperty("Cookie", requiredCookies);
//Set to POST
connection.setDoOutput(true);
Writer writer = new OutputStreamWriter(connection.getOutputStream());
writer.write(dataString);
writer.flush();
writer.close();
connection.connect();

if (connection.getResponseCode() == 200 || connection.getResponseCode() == 201) {
    System.out.println(connection.getContent().toString());
} else {
   System.out.println("Error");
}
} catch (IOException e) {
   // TODO Auto-generated catch block
     e.printStackTrace();
} catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}

System.out.println("------------------POST END---------------------");
يتم عرض

وVIOLA 200 ويعمل كل شيء وكأنه سحر. ماذا تظنون يا جماعة؟ هل يمكن لشخص يرجى تزويدي جوابا لأنني لا أستطيع معرفة ذلك.

هل كانت مفيدة؟

المحلول

والمشكلة على ما يبدو أن لديك اثنين من أسماء المضيفين مختلفة في الإعداد. سيؤدي هذا العميل HTTP الكوكيز لا ترسل لمجموعة مختلفة. قد تتمكن من محاولة تغيير المجال من الكعك في مخزن ملفات تعريف الارتباط، أو استخدام نفس المضيف لGET و POST. بالإضافة إلى ذلك يمكنك إضافة يدويا الكوكيز لرؤوس في عميل HTTP كما فعلت في المثال HttpURLConnection.

نصائح أخرى

وأعتقد أنه كان من الخطأ الذي استخدمته اثنين من مجالات مختلفة تماما لمدة طلباتك - أي كنت تحاول إخفاء URL الخاص بك الحقيقي؟ إذا لم يكن كذلك، ثم هذا هو السبب في أنك لا تحصل على أية ملفات تعريف الارتباط. إذا كانت مجرد محاولة لإخفاء URL الخاص بك، وأيضا هذا هو السبب في وجود example.com . :)

وبدلا من ذلك، وهذا هو تماما من على قمة رأسي من التعليمات البرمجية كتبت في الأسبوع الماضي - عملت غرامة عبر عدة يحصل، وظائف والنطاقات الفرعية:

DefaultHttpClient httpClient = new DefaultHttpClient();
CookieStore cookieJar = new BasicCookieStore();
httpClient.setCookieStore(cookieJar);

وأي بمعنى. أنا باستخدام صراحة DefaultHttpClient، التي أعتقد أنها لديه تلك الحصول على إضافية / اضعي لتخزين ملفات تعريف الارتباط. أنا لا أعتقد أنني استخدمت أي سياق الكائنات سواء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top