2012-11-06 3 views
1

Google App Engine에서 URLFetch 클래스를 사용하여 PHP 웹 페이지 (일부 다른 웹 사이트)에 연결했습니다.Google App Engine의 HTTP Post는 시간의 절반 만 작동합니다.

이 내가

try{ 
byte[] data = ("[email protected]&TITLE=evolution&COMMENT=comments&PRICE=5000").getBytes("UTF-8"); 
URL url = new URL("http://www.box.com/nost.php"); 
HTTPRequest request = new HTTPRequest(url, HTTPMethod.POST); 
request.setPayload(data); 
HTTPResponse response = URLFetchServiceFactory.getURLFetchService().fetch(request); 
} 

지금이 내가 로컬로 배포 할 때 완벽하게 잘 작동하는 것 같다있을 것입니다. 그러나 Google 앱 엔진에 게시하면 시간의 절반 만 작동합니다. (정확히 동일한 데이터로도 게시판을 두 번 이상 누르면 오류 또는 성공 일 수 있음)

전 데이터를 변경하지 않으므로 이는 완전히 무작위 적으로 보입니다. 누군가 이런 일이 일어나는 이유에 대해 조언 해 줄 수 있습니까?

EDIT :이 코드는 입니다. 제 PHP가 gae가 만들고있는 HTTP 요청을 차단하고있는 것처럼 보입니다. 나는 catch 블록 내부의 재귀를 사용하여 성공할 때까지 계속 시도하도록 수정했다.

try { 
    URL url = new URL("http://www.mywebsite.com/myfile.php"); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setDoOutput(true); 
    connection.setRequestMethod("POST"); 

    OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); 
writer.write("EMAIL="+URLEncoder.encode("[email protected]", "UTF-8")+ 
"&TITLE="+URLEncoder.encode("myTitle", "UTF-8")+ 
"&PRICE="+URLEncoder.encode(String.valueOf(10000), "UTF-8")); 
writer.close(); 

if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { 
// OK 
return true; 
} else { 
// Server returned HTTP error code. 
//keep retrying until you succeed!! fighting!! 
return newPost(postComponent); 
} 
} catch (MalformedURLException e) { 
e.printStackTrace(); 
return false; 
} catch (IOException e) { 
e.printStackTrace(); 
return false; 
} 
catch (Exception e){ 
e.printStackTrace(); 
//ah dam probably server is down so you went stack overflow I give up 
return false; 
} 
+2

"작동하지 않음"을 정의하십시오. "오류"를 정의하십시오. 나는 반 십 이명의 답을 줄 수 있었지만 지금 당장 나는 이상한 추측을 할 수 없다. HTTP 오류 코드 또는 예외를 의미하는지 여부도 알 수 없습니다. –

답변

3

대신 URLFetch 서비스를 사용하는 대신 java.net을 사용하는 것이 좋습니다.

내 경험에 의하면, 이것은 갈 길입니다. 전에 테스트 시나리오를 설정하여 컬렉션을 반복하고 원격 서버에 많은 수의 POST 요청을 한 다음 브라우저에 수와 출력을 쓰면 성공한 횟수와 실패한 수를 확인할 수 있습니다.

결과는 흥미 롭습니다. 나는 로그에서 예외를 보았고, 나 자신에게 "왜 네트워크가 끔찍한지를 알아 내려고 위대한 시간을 낭비했습니다!"라고 생각했습니다. 글쎄, 나는 백개와 천 개의 테스트 케이스에 대한 나의 결과를 보았고, 모두 성공했다.

예외를 조사한 결과, 예를 들어 서버에서 500 응답을 얻으면 코드가 실제로 요청을 두 번째 시도합니다. 그래서 500 건의 오류가 있었음에도 불구하고 모든 사례가 성공적이었습니다!

서버 문제 또는 사소한 네트워크 문제에 대한 자체 오류 처리기를 작성해야 할 필요가 없어 졌으므로이 라이브러리가 나를 위해 처리했습니다.

import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLEncoder; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 

// ... 
     String message = URLEncoder.encode("my message", "UTF-8"); 

     try { 

      // this is your url that you're posting to 
      URL url = new URL("http://www.box.com/nost.php"); 

      // create and open the connection using POST 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoOutput(true); 
      connection.setRequestMethod("POST"); 

      OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); 

      // this is your data that you're sending to the server! 
      writer.write("[email protected]&TITLE=evolution&COMMENT=comments&PRICE=5000"); 

      writer.close(); 

      // this is where you can check for success/fail. 
      // Even if this doesn't properly try again, you could make another 
       // request in the ELSE for extra error handling! :)   
      if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { 
       // OK 
      } else { 
       // Server returned HTTP error code. 
      } 
     } catch (MalformedURLException e) { 
      // ... 
     } catch (IOException e) { 
      // ... 
     } 

기억

다음의 예는 어떤 형태의 데이터가 포함 된 URL에 HTTP POST 요청을한다 :

java.net - HTTPURLConnection 는 서버로 데이터를 전송할 때 매우 신뢰성이 입증되었습니다 , 당신은 PHP 파일을 요청하지 않고, 서버에 요청을합니다. 후드 아래의 모든 HTTP는 파일 유형에 차이가 없습니다. 희망이 도움이!

Google에서 예제를 편집하여 원격 끝점과 쿼리 문자열 데이터를 사용합니다.

+0

나는 다른 곳에서 당신의 답을 읽었지만 전혀 도움이되지 않았다. 나는 PHP 파일에 http 요청을하려고 노력 중이며 xml 파일을 읽으 려하지 않는다. –

+0

java.net은 XML을 읽기위한 것이 아니라 원격 서버에서 내용을 가져 오는 것입니다.HTML, CSS, JavaSript, XML, CSV 파일 또는 쿼리 매개 변수 만 보낼 수 있습니다. 이것은 A에서 B로 데이터를 가져 오는 일반적인 고급 도구입니다. 이것은 단지 예일 뿐이며 고유 한 데이터 세트에 맞게 조정해야합니다. 여기서 누락 된 부분은 장애 조치 (failover) 기능이 내장되어있어 많은 장애가 발생할 경우 필요한 것처럼 들릴 수 있다는 것입니다. 당신이 의미하는 바를 상세히 설명해 주시겠습니까? 어떤 종류의 오류가 실제로 발생합니까? – jmort253

+0

오, 죄송합니다. 쿼리 매개 변수를 보내는 데 사용할 수 있는지 모르겠습니다. 쿼리 매개 변수를 보내도록 코드를 변경하는 방법에 대한 정보가 거의 없습니다. 문제의 원인을 파악하고 있지만 로그가 앱 엔진에 이미 배포되어 있기 때문에 어떻게 볼 수 있는지 잘 모르겠습니다. –