HttpURLConnection 이상 java. io. FileNotFoundException

5052 단어 기초 지식
오늘 앱 을 디 버 깅 할 때 HttpURLConnection 으로 서버 데 이 터 를 가 져 올 때 java. io. FileNotFound Exception 이상 이 발생 했 습 니 다. 원인 은 아직 밝 혀 지지 않 았 지만 해결 방법 을 찾 았 습 니 다.
우리 의 서버 데 이 터 는 두 가지 유형 이 있 기 때문에 하 나 는 xml (요청 테이프 파라미터, 즉 post 방식) 이 고 하 나 는 json 형식 (요청 파 라 메 터 는 url 뒤에 직접 추가 되 며 get 방식 이 어야 합 니 다) 입 니 다.
이전에 요청 한 이 두 가지 데 이 터 는 모두 같은 방식 으로 얻 은 post 방식 입 니 다. 방법 은 다음 과 같 습 니 다.
json 데이터 주소http://72.52.93.xxx/hdepg_data/dataForQuanQiuBo/2220143.js
/**
	 * post    
	 * @param param			    
	 * @param urlStr		    
	 * @param contentType	    
	 * @return
	 */
	public InputStream postMethod(String param, String urlStr,
			String contentType) {

		InputStream is = null;
		try {
			byte[] xmlData = param.getBytes("UTF-8");
			URL url = new URL(urlStr);
			URLConnection urlCon = url.openConnection();
			urlCon.setDoOutput(false);
			urlCon.setDoInput(true);
			urlCon.setConnectTimeout(40000);
			urlCon.setReadTimeout(40000);
			urlCon.setUseCaches(false);
			urlCon.setRequestProperty("Content-Type", contentType);
			urlCon.setRequestProperty("Content-length",
					String.valueOf(xmlData.length));
			DataOutputStream printout = new DataOutputStream(
					urlCon.getOutputStream());
			printout.write(xmlData);
			printout.flush();
			printout.close();
			is = urlCon.getInputStream();
		} catch (IOException e) {
			Log.e(TAG, "Url connection failed!");
			e.printStackTrace();
		} catch (Exception e) {
			Log.e(TAG, "Failed getting input stream!");
			e.printStackTrace();
		}
		return is;
	}

나중에 제 이 슨 데이터 가 주 소 를 바 꾸 었 습 니 다.http://xxx.hanyastar.com/hdepg_data / dataForQuanQiuBo / xxxx. js, post 방식 으로 데 이 터 를 요청 할 때 java. io. FileNotFoundException 이상 이 발생 합 니 다.느낌 이 이상 하 다. 주 소 를 바 꿨 을 뿐 다른 조작 은 변 하지 않 았 는데 왜 성공 적 으로 접근 하지 못 했 을 까?
나중에 인터넷 에 접속 해서 찾 아 보 니 누군가가 이렇게 말 하 는 것 을 발견 했다.
    :http://www.mikebai.com/html/2012-03/939.html

       4.0 
       app,    xml        :java.io.FileNotFoundException: http://www.jpfocus.com/xxxx.xml

   2.3          

    :

URL url = new URL(urlstr);
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setRequestMethod("GET");
httpCon.setDoOutput(true);
httpCon.connect();

  :
4.0   httpCon.setDoOutput(true),      post    ,     httpCon.setRequestMethod("GET");
     httpCon.setDoOutput(true);    



  setDoOutput(true)

        ,  true,        ,  body      server , POST PUT     。GET        。

새 주 소 는 post 방식 을 지원 하지 않 습 니까?
그래서 나 는 요청 방법 을 수정 했다.
public InputStream postMethodHanya(String param, String urlStr,
			String contentType) {

		InputStream is = null;
		try {
			byte[] xmlData = param.getBytes("UTF-8");
			URL url = new URL(urlStr);
			URLConnection urlCon = url.openConnection();
			urlCon.setDoOutput(false);
			urlCon.setDoInput(true);
			urlCon.setConnectTimeout(40000);
			urlCon.setReadTimeout(40000);
			urlCon.setUseCaches(false);
//			urlCon.setRequestProperty("Content-Type", contentType);
//			urlCon.setRequestProperty("Content-length",
//					String.valueOf(xmlData.length));
//			// urlCon.setFixedLengthStreamingMode(xmlData.length);
//			DataOutputStream printout = new DataOutputStream(
//					urlCon.getOutputStream());
//			printout.write(xmlData);
//			printout.flush();
//			printout.close();
			is = urlCon.getInputStream();
		} catch (IOException e) {
			Log.e(TAG, "Url connection failed!");
			e.printStackTrace();
		} catch (Exception e) {
			Log.e(TAG, "Failed getting input stream!");
			e.printStackTrace();
		}
		return is;
	}
post 의 body 인 자 를 설명 합 니 다. (설명 하지 않 으 면 setDoOutput 이 false 로 설정 되 었 을 때 보고 합 니 다. java. net. ProtocolException: method does not support a request body: GET), setDoOutputs 는 false (또는 주석 제거) 로 설정 합 니 다.이 방법 으로 새 주소 json 데 이 터 를 가 져 오 면 성공 합 니 다.
get 방식 으로 제 이 슨 데 이 터 를 얻 었 지만 왜 두 주소 의 앞 뒤 차이 가 있 는 지 아직 모 르 겠 습 니 다. 여기에 기록 하 세 요.대신 이 아시 면 가르쳐 주 십시오.
ps: setDoInput 과 setDoOutput 의 의미
public void setDoInput(boolean doinput) URLConnection 의 doInput 필드 의 값 을 지정 한 값 으로 설정 합 니 다.    
URL 연결 은 입력 과 / 또는 출력 에 사용 할 수 있 습 니 다.하면, 만약, 만약... URL 연결 하여 입력 하면 DoInput 플래그 설정 true;사용 하지 않 으 려 면 false。기본 값 true。  
public void setDoOutput(boolean dooutput) 이것 을 URLConnection 의 doOutput 필드 의 값 을 지정 한 값 으로 설정 합 니 다.    
URL 연결 은 입력 과 / 또는 출력 에 사용 할 수 있 습 니 다.하면, 만약, 만약... URL 연결 하여 출력 하면 DoOutput 플래그 설정 true;사용 하지 않 으 려 면 false。기본 값 false。    
httpUrlConnection.setDoOutput(true);나중에 conn. getOutputStream (). write () 를 사용 할 수 있 습 니 다.  
httpUrlConnection.setDoInput(true);나중에 conn. getInputStream (). read () 를 사용 할 수 있 습 니 다.  
  
get 요청 은 conn. getOutputStream () 을 사용 할 수 없습니다. 매개 변 수 는 주소 뒤에 직접 추가 되 기 때문에 기본 값 은 false 입 니 다.  
post 요청 (예: 파일 업로드) 은 서비스 구역 에 대량의 데 이 터 를 전송 해 야 합 니 다. 이 데 이 터 는 http 의 body 에 놓 여 있 기 때문에 연결 을 만 든 후에 서버 에 데 이 터 를 써 야 합 니 다.  
  
항상 conn. getInputStream () 을 사용 하여 서버 의 응답 을 가 져 오기 때문에 기본 값 은 true 입 니 다.

좋은 웹페이지 즐겨찾기