从接口获取数据出现问题(新手求助~)

LeoHirasawa 2014-08-22 12:16:18
想做一个天气预报的功能,所以尝试着从网上的接口获取JSON数据,有一个在网上COPY下来的sycnhttp类,一个mainActivity,按照网上的教程先启动了tomcat,然后运行程序,结果出了问题,显示Toast为“未找到”,说明抛出了异常(经过我用Toast测试,在String retStr = syncHttp.httpGet(urlStr, paramsStr);这句时就无法执行了,但是可以进入try语句块,说明与后面对JSON的解析应该没什么关系。。应该就是这句话进行不下去,数据应该是没获取到),若水的教程把一个WAR包放到了tomcat的webapps文件夹中,我不会web开发什么的,小白不懂这个有用没?简单的从接口获取数据需要这个东西吗?这个天气接口,在浏览器上直接输入是有效的,但是在程序中无法获取到数据。小白求大神帮忙看看,到底是哪里出了问题呢??跪求大神啦,这任务比较紧

sycnhttp类

package com.leo.http;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

import org.apache.http.params.HttpConnectionParams;

import android.R.integer;


public class SyncHttp
{


private static final int TIME_OUT = 1000 * 6; // 超时
private static final String METHOD_POST = "POST";
private static final String METHOD_GET = "GET";
private static final int HTTP_OK = 200;
private final String CHARTSET = "UTF-8"; //字符编码
private final int BUFFER = 1024 * 8;//缓冲区
public String httpGet(String urlStr, String paramsStr) throws Exception
{

StringBuilder urlBuilder = new StringBuilder();
urlBuilder.append(urlStr);
if (null!=paramsStr&&!paramsStr.equals(""))
{
urlBuilder.append("?");
urlBuilder.append(paramsStr);
}
//Log.i(Constants.TAG, urlBuilder.toString());
URL url = null;
HttpURLConnection conn = null;
InputStream inStream = null;
String response = null;
try
{
url = new URL(urlBuilder.toString());
System.out.println("");
//根据URL打开远程连接
conn = (HttpURLConnection) url.openConnection();
//设置参数
conn.setDoInput(true);
conn.setConnectTimeout(TIME_OUT);
conn.setRequestMethod(METHOD_GET);
conn.setRequestProperty("accept", "*/*");
//建立连接
conn.connect();
//接受返回码
int responseCode = conn.getResponseCode();
if (responseCode == HTTP_OK)
{
//获取输入流
inStream = conn.getInputStream();
//从输入流中获取信息
response = getResponse(inStream);
}
else
{
//请求失败
response = "返回码:"+responseCode;
}
} catch (Exception e)
{
throw e;
}
finally
{
//关闭连接
conn.disconnect();
}
return response;
}

private String getResponse(InputStream inStream) throws IOException
{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = -1;
byte[] buffer = new byte[BUFFER];//缓冲区
while((len=inStream.read(buffer))!=-1)
{
outputStream.write(buffer, 0, len);
}
byte[] data = outputStream.toByteArray();
return new String(data);
}
}


mainActivity

package com.leo.http;

import org.json.JSONArray;
import org.json.JSONObject;

import android.R.string;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Build;

public class MainActivity extends Activity
{
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getweather();
}

private void getweather()
{
String urlStr = "http://api.k780.com:88/";
String paramsStr = "app=weather.future&weaid=1&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
SyncHttp syncHttp = new SyncHttp();

try
{
String retStr = syncHttp.httpGet(urlStr, paramsStr);//这句执行不了
Toast.makeText(MainActivity.this,"ok", Toast.LENGTH_LONG).show();

JSONObject jsonObject = new JSONObject(retStr);
String retstring1 = jsonObject.getString("success");

if (retstring1=="0")
{

JSONArray list = jsonObject.getJSONArray("results");

for (int i = 0; i < 1; i++)//测试,所以只读取数组的第一项
{
JSONObject weatherlist = (JSONObject)list.opt(i);
String date = weatherlist.getString("days");
String weather = weatherlist.getString("week");
String wind = weatherlist.getString("temperature");
String temperature = weatherlist.getString("weather");
Toast.makeText(MainActivity.this,"OK!", Toast.LENGTH_LONG).show();
}

}

else
{
//Toast.makeText(MainActivity.this, "未找到!", Toast.LENGTH_LONG).show();//被执行的不是这个toast,将其注释掉了还是会出现“未找到”
}

}

catch (Exception e)
{
e.printStackTrace();
Toast.makeText(MainActivity.this, "未找到!", Toast.LENGTH_LONG).show();//在此处接收到了异常,这个toast被执行了
}

}
}


在运行程序前启动了tomcat


接口在浏览器可实现内容
http://api.k780.com:88/?app=weather.future&weaid=1&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json

下面是LOGCAT(觉得报错的内容好像和我出现的问题没什么关联。。)

...全文
455 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
khuigb 2014-11-24
  • 打赏
  • 举报
回复
http://www.haoservice.com/docs/6这个接口可以用的.
Mr_Sun_01 2014-08-25
  • 打赏
  • 举报
回复
引用 9 楼 LeoHirasawa 的回复:
[quote=引用 7 楼 sunguanyong 的回复:] 你贴的那个网址,它是可以显示json数据的,说明网络可用,这个不需要你使用tomcat。如果你想找错,那就先不要拼接网址的操作,直接就用那个贴出来的网址,自己再对一下代码中连接设置之类的参数
不需要那个什么WAR包吧?[/quote] 不知道WAR是什么东西
LeoHirasawa 2014-08-22
  • 打赏
  • 举报
回复
不要沉 不要沉啊
LeoHirasawa 2014-08-22
  • 打赏
  • 举报
回复
自顶自顶,求解答哦
LeoHirasawa 2014-08-22
  • 打赏
  • 举报
回复
引用 7 楼 sunguanyong 的回复:
你贴的那个网址,它是可以显示json数据的,说明网络可用,这个不需要你使用tomcat。如果你想找错,那就先不要拼接网址的操作,直接就用那个贴出来的网址,自己再对一下代码中连接设置之类的参数
不需要那个什么WAR包吧?
LeoHirasawa 2014-08-22
  • 打赏
  • 举报
回复
引用 6 楼 sunguanyong 的回复:
具体问题我先不看,既然是网络上的资源,那和tomcat有什么关系?表示好奇
那也不需要什么WAR包是吧?
Mr_Sun_01 2014-08-22
  • 打赏
  • 举报
回复
你贴的那个网址,它是可以显示json数据的,说明网络可用,这个不需要你使用tomcat。如果你想找错,那就先不要拼接网址的操作,直接就用那个贴出来的网址,自己再对一下代码中连接设置之类的参数
Mr_Sun_01 2014-08-22
  • 打赏
  • 举报
回复
具体问题我先不看,既然是网络上的资源,那和tomcat有什么关系?表示好奇
lionfresh 2014-08-22
  • 打赏
  • 举报
回复
android4.0以后不允许在UI线程中进行网络操作,所以会失败。比较好的办法是使用AsyncTask,将网络操作放在AsyncTask中。
daydreary 2014-08-22
  • 打赏
  • 举报
回复
这个网络请求是在UI线程里做的?建议你放到单独的线程里再试试
bejjjj 2014-08-22
  • 打赏
  • 举报
回复
不要沉 不要沉啊

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧